You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 4.8正则本地正常生产环境误删等号,求排查原因

.NET Framework 4.8正则在en-US区域误删等号的问题排查

问题概况

  • 需求:移除XML文件中的非法特殊字符
  • 异常现象:本地及正则测试工具运行正常,但在en-US区域文化的生产环境中,合法的等号(=)被错误替换为空
  • 运行环境:.NET Framework 4.8

复现代码

using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main(string[] args)
    {
        string xmlString = "<root><name>John & = Doe</name></root>";

        // Replace special characters with their XML entities
        string cleanedXml = Regex.Replace(xmlString, @"[^\u09\u0A\u0D\u20-\uD7FF\uE000-\uFFFD\u10000-\u10FFFF]", 
                                       string.Empty);
    
        Console.WriteLine(cleanedXml);
    }
}

问题原因

问题出在.NET正则表达式的文化敏感排序行为上:
默认情况下,.NET Framework的正则引擎会使用当前线程的区域文化(此处为en-US)的排序规则解析字符范围(如\u20-\uD7FF),而非严格按照Unicode码点的数值顺序判断。

虽然等号=的Unicode码点是\u003D,数值上确实落在\u20-\uD7FF区间内,但en-US区域的排序权重逻辑导致正则引擎误判=不在该区间内,因此被纳入否定字符类[^...]的匹配范围,最终被替换为空。

解决方案

在Regex.Replace方法中添加RegexOptions.CultureInvariant选项,强制正则引擎按照Unicode码点的数值顺序解析字符范围,不受区域文化影响:

修改后的代码:

string cleanedXml = Regex.Replace(xmlString, @"[^\u09\u0A\u0D\u20-\uD7FF\uE000-\uFFFD\u10000-\u10FFFF]", 
                               string.Empty, RegexOptions.CultureInvariant);

修改后,无论当前区域文化是什么,正则都会严格按Unicode码点判断字符合法性,等号=会被正确保留,同时依然能过滤XML的非法特殊字符。

内容的提问来源于stack exchange,提问作者Azhagupandiyan Venkatesan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 16:16:29