使用\还是\\进行正则表达式转义?

13

有人可以解释一下在使用正则表达式时何时需要使用双反斜线或单反斜线来转义字符吗?

很多在线参考都使用单个反斜杠,而在线正则表达式测试工具也使用单个反斜杠,但实际上我经常需要使用双反斜杠来转义字符。

例如:

"SomeString\."

在一个在线的正则表达式测试器中,匹配以 "SomeString" 开头并跟着一个点号的内容。

然而在实际使用中,我不得不使用双重转义:

if (Regex.IsMatch(myString, "SomeString\\."))

虽然针对JavaScript,但您可能会发现此答案有帮助。 - ridgerunner
5个回答

24

C#没有像Perl、Ruby或JavaScript那样用于构建正则表达式的特殊语法。相反,它使用一个接受字符串参数的构造函数。然而,字符串有它们自己的转义机制,因为你希望能够将引号放在字符串中。因此,有两个级别的转义。

所以,在正则表达式中,w表示字母"w",而\w表示单词字符。但是,如果你创建一个字符串"\w",你正在转义字符"w",这是没有意义的,因为字符"w"既不是引号也不是反斜杠,所以"w" == "\w"。然后,这个只包含"w"的字符串被传递给regexp构造函数,你最终会匹配字母"w"而不是任何单词字符。因此,为了将反斜杠传递给regexp,你需要在字符串文字中放入两个反斜杠(\\w):一个将在解释字符串文字时被移除,一个将被正则表达式使用。

当直接使用正则表达式(如大多数在线正则表达式测试器或使用原始字符串@"..."时),你无需担心字符串文字的解释,并且总是只写一个反斜杠(除非你想匹配反斜杠本身,但那时你是为regexp转义反斜杠,而不是为字符串转义)。


7

\ 在C#中也是字符串文字的转义字符,因此第一个 \ 转义了传递给方法的第二个 \,而第二个 \ 转义了正则表达式中的 .。

用法:

if (Regex.IsMatch(myString, @"SomeString\."))

如果您想避免双重转义。

5
如果您使用一个verbatim符号@(verbatim字符串),则无需再次转义反斜杠。
if (Regex.IsMatch(myString, @"SomeString\."))

1
这很好,但并没有真正回答这个问题:“当使用正则表达式时,需要使用双反斜杠还是单反斜杠来转义字符?” 我没有投票反对。 - Yuliam Chandra
我知道这是可能的,但我想知道为什么在我的示例中需要它而在你的示例中不需要? - Duane
在Java或C#中,如果您仅使用"作为分隔符,则需要再次转义反斜杠。此外,请参阅Ben或Amadan的答案以获取更多信息。 - Avinash Raj

-1

1
不完全是这样。如果您有字符串“\b”,并对其执行Regex.Escape(),则不会像您期望的那样得到“\b”,因为“\b”已经是原始字符串中的特殊字符,并且永远不会在编译后的代码中被视为“\”+“b”。 - Nyerguds
该方法真糟糕,特别是在处理字符串中的正则表达式特殊字符(如反斜杠)时更是如此。 - Harvey Lin

-1
在JavaScript中,您必须使用双重转义字符:\。
let m = "My numer is [56]".match("\\[(.*)\\]"); 
alert(m[1]);//outputs 56

在C#中单个反斜杠 \


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接