如何在C#正则表达式中匹配竖线字面量及解决转义报错
解决C#正则匹配竖线(|)字面量的转义问题
嘿,这个问题我之前调试正则的时候也踩过坑,核心是你混淆了C#字符串的转义规则和正则表达式的转义规则,咱们一步步理清楚:
为什么你原来的写法会报错?
你直接写"\|"的时候,C#编译器会先解析这个字符串:它把\当成字符串转义符,但C#里根本没有\|这种合法的转义序列(C#支持的转义符比如\n换行、\"双引号这类),所以自然会抛出“未识别的转义序列”错误——这时候正则表达式还没机会处理你的字符串呢!
而且还要注意:竖线|在正则里是特殊元字符,表示“逻辑或”(比如a|b会匹配a或者b),所以就算你绕过了C#的转义,直接把|丢给正则,它也不会当成字面量匹配,而是执行逻辑或的功能。
正确的两种解决方法
方法1:双重转义(字符串+正则都转义)
因为C#字符串里要表示一个字面量的\,需要写成\\;而正则里要表示字面量的|,需要写成\|。把两者结合起来,就是用"\\|":
using System.Text.RegularExpressions; string testInput = "Hello|World"; // 匹配竖线字面量 bool containsPipe = Regex.IsMatch(testInput, "\\|"); // 结果会返回true
方法2:使用Verbatim字符串(@前缀)
C#的Verbatim字符串(加@前缀)会忽略字符串内部的转义规则,里面的\会被当成字面量处理。这样你只需要按照正则的要求转义竖线就行,直接写@"\|":
bool containsPipe = Regex.IsMatch(testInput, @"\|");
这种写法更清晰,尤其是正则表达式比较长的时候,能避免一堆重复的\\。
额外验证小技巧
如果你不确定自己写的正则字符串最终被解析成什么,可以直接输出看看:
Console.WriteLine("\\|"); // 输出结果是 \| Console.WriteLine(@"\|"); // 输出结果也是 \|
这两种写法最终传给正则引擎的都是\|,刚好是匹配竖线字面量需要的正则表达式。
内容的提问来源于stack exchange,提问作者Daniel Patrick
相关产品推荐
相关产品推荐

