. 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 = "assdabv";
Console.WriteLine(_invalidXMLChars.IsMatch(text));
}
}
该测试项目使用.NET fiddle输出预期结果(True);
但是当我尝试在我的项目中实现相同的代码时,没有找到无效字符并输出"False"。
为什么这工作在。net小提琴,但不是在我的项目?
不能修改源XML文件
Visual Studio是对的。字符&
, #
, x
, F
或;
都不是Regex的一部分。然而,在HTML中,
转换为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("assdabv");
Console.WriteLine(_invalidXMLChars.IsMatch(text));
}
第二个选择是使用正则表达式来匹配转义序列:
var text2 = "assdabv";
var rx = new Regex(@"&#x[0-9A-F];");
Console.WriteLine(rx.IsMatch(text2));
希望这对你有帮助!