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



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

class Program
{
    private static Regex _invalidXMLChars = new Regex(@"(?<![uD800-uDBFF])[uDC00-uDFFF]|[uD800-uDBFF](?![uDC00-uDFFF])|[x00-x08x0Bx0Cx0E-x1Fx7F-x9FuFEFFuFFFEuFFFF]", RegexOptions.Compiled);
    static void Main(string[] args)
    {
        var text = "assd&#xF;abv";
        Console.WriteLine(_invalidXMLChars.IsMatch(text));
    }
}

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

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

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

不能修改源XML文件

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

在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-x08x0Bx0Cx0E-x1Fx7F-x9FuFEFFuFFFEuFFFF]", RegexOptions.Compiled);
    public static void Main()
    {
        var text = "assdu000fabv";
        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));

希望这对你有帮助!

最新更新