.NET 6.0 Regex.Replace不识别\X转义序列,请问有什么替代方案?
错误原因
\X是PCRE等正则引擎支持的特殊转义序列,用于匹配Unicode字形簇,但你使用的System.Text.RegularExpressions(.NET正则类库)不支持该语法,因此会抛出无法识别转义序列的报错。你在regex101站点测试正常,是因为站点默认或你手动选择了PCRE引擎,和.NET的正则语法规范不兼容。
替代方案
你原正则的需求为匹配</al>后跳过任意空白,捕获<a开头到下一个<al>前的所有内容,可通过以下两种方式实现:
方案1:无需额外指定匹配参数
用[\s\S]替代\X,该组合表示匹配所有空白+非空白字符,等价于匹配任意字符(包含换行符),改后正则为:
</al>\s*(<a[\s\S]*)<al>
C#中推荐使用verbatim字符串(字符串前加@)避免转义冲突,示例代码:
var regex = new Regex(@"</al>\s*(<a[\s\S]*)<al>");
如果你的内容中存在多个<al>标签,需要匹配到最近的第一个<al>,将贪婪匹配改为非贪婪即可:
</al>\s*(<a[\s\S]*?)<al>
方案2:开启单行匹配模式
指定RegexOptions.Singleline参数后,.可以匹配包括换行符在内的所有字符,改后正则为:
</al>\s*(<a.*)<al>
C#示例代码:
var regex = new Regex(@"</al>\s*(<a.*)<al>", RegexOptions.Singleline);
同样需要非贪婪匹配的话,改为.*?即可。
内容的提问来源于stack exchange,提问作者Jordi van Dijk
相关产品推荐
相关产品推荐

