. net fiddle/Visual Studio: regex替换无效XML字符的不同结果

本文关键字:字符 XML 结果 无效 替换 fiddle Visual Studio regex net | 更新日期: 2023-09-27 18:10:02

我试图从XML文件中过滤无效字符,并有以下测试项目;

class Program
{
    private static Regex _invalidXMLChars = new Regex(@"(?<!['uD800-'uDBFF])['uDC00-'uDFFF]|['uD800-'uDBFF](?!['uDC00-'uDFFF])|['x00-'x08'x0B'x0C'x0E-'x1F'x7F-'x9F'uFEFF'uFFFE'uFFFF]", RegexOptions.Compiled);
    static void Main(string[] args)
    {
        var text = "assd&#xF;abv";
        Console.WriteLine(_invalidXMLChars.IsMatch(text));
    }
}

该测试项目使用.NET fiddle输出预期结果(True);

但是当我尝试在我的项目中实现相同的代码时,没有找到无效字符并输出"False"。

为什么这工作在。net小提琴,但不是在我的项目?

不能修改源XML文件

. net fiddle/Visual Studio: regex替换无效XML字符的不同结果

Visual Studio是对的。字符&, #, x, F;都不是Regex的一部分。然而,在HTML中,&#xF;转换为c#的附属'u000f,然后由于Regex定义'0xE-'0x1F而被替换。

在Visual Studio中使用'u000f给出了一个匹配:

using System;
using System.Text.RegularExpressions;
public class Program
{
    private static Regex _invalidXMLChars = new Regex(@"(?<!['uD800-'uDBFF])['uDC00-'uDFFF]|['uD800-'uDBFF](?!['uDC00-'uDFFF])|['x00-'x08'x0B'x0C'x0E-'x1F'x7F-'x9F'uFEFF'uFFFE'uFFFF]", RegexOptions.Compiled);
    public static void Main()
    {
        var text = "assd'u000fabv";
        Console.WriteLine(_invalidXMLChars.IsMatch(text));
    }
}

正则表达式不适用,因为字符串包含转义序列,该转义序列将在稍后呈现"非法"字符。

要将其过滤掉,您必须在测试正则表达式之前取消转义字符串:

static void Main(string[] args)
{
    var text = System.Web.HttpUtility.HtmlDecode("assd&#xF;abv");
    Console.WriteLine(_invalidXMLChars.IsMatch(text));
}

第二个选择是使用正则表达式来匹配转义序列:

var text2 = "assd&#xF;abv";
var rx = new Regex(@"&#x[0-9A-F];");
Console.WriteLine(rx.IsMatch(text2));

希望这对你有帮助!