C#中使用@后正则仍报“Unrecognized escape sequence \_”错误排查
解决C#正则中“Unrecognized escape sequence _”的报错问题
我太懂这种挫败感了——明明在正则测试工具上跑的顺顺当当,一挪到C#里就报错,简直让人挠头😅。咱们来一步步拆解问题:
核心原因:正则引擎的转义规则差异
你遇到的问题本质是不同正则引擎对转义字符的处理逻辑不一样:
- 下划线
_在正则里属于普通字符,不管是哪个引擎都不需要转义。你在测试工具里写的\_可能是误加了转义,或者工具默认的引擎(比如JavaScript)对这种无效转义比较宽容,不会报错。 - 但在C#的.NET正则引擎里,
\后面必须跟着一个合法的转义目标(比如\d匹配数字、\.匹配点号)。当它看到\_时,会认为你试图转义一个不需要转义的字符,直接抛出“未识别的转义序列”错误——哪怕你加了@逐字字符串也没用,因为@只是让C#编译器不解析字符串里的转义,正则引擎本身还是会按自己的规则处理正则语法。
快速解决步骤
清理无效转义:把正则表达式里所有的
\_直接替换成_就行,因为下划线在.NET正则里不需要转义。
比如:- 错误写法:
@"foo\_bar" - 正确写法:
@"foo_bar"
- 错误写法:
如果需要匹配字面量
\_:要是你的需求是匹配文本中真实存在的\+_组合(比如字符串里的\test_code),那你需要在正则里把反斜杠转义(因为反斜杠本身是正则的特殊字符),写法是:// 匹配字面量的\_ var regex = new Regex(@"\\_");
避坑小技巧
以后在写C#的正则时,直接在测试工具里切换到**.NET引擎**(别用默认的JavaScript),这样你写的正则语法能直接适配C#,提前避免这类跨引擎的转义问题。
内容的提问来源于stack exchange,提问作者Georgi
相关产品推荐
相关产品推荐

