在正则表达式中如何转义斜杠

138
我的问题很简单,是关于正则表达式转义的。在正则表达式中,您是否需要转义正斜杠/?如果需要,您该如何转义?

1
你使用哪种语言/正则表达式实现? - Gumbo
1
有趣的是,我正在寻找JavaScript相关的问题。但是我的IDE表示我使用了不必要的转义符。所以myStr.replace(/[/:.-]+/gi, '_')出人意料地有效。我原本以为我需要/[\/:.-]+/gi。我无法确定这是酷还是令人困惑。 - Turbo
6个回答

118

需要考虑哪种语言或上下文环境?一些语言使用/作为模式分隔符,因此根据语言/上下文环境,您需要对其进行转义。您可以通过在其前面添加反斜杠来对其进行转义:\/ 对于某些语言(如PHP),您可以使用其他字符作为分隔符,因此不需要对其进行转义。但我所知道的是,在所有语言中,/唯一的特殊意义就是它可能是指定的模式分隔符。


43

以下是几个选项:

在Perl中,您可以选择替代分隔符。您不必局限于使用m//。您可以选择其他分隔符,例如m{}。这样就不需要转义了。事实上,《Perl最佳实践》一书中的Damian Conway断言,m{}是唯一应该使用的替代分隔符,这得到了Perl::Critic(在CPAN上)的支持。虽然您可以使用各种替代分隔符字符,但//{}似乎是后来最清晰易懂的。但是,如果这两个选择中的任何一个导致太多的转义,请选择哪个更适合可读性。常见的示例包括m(...)m[...]m!...!
在某些情况下,您无法或不愿使用替代分隔符时,可以使用反斜杠转义正斜杠:m/\/[^/]+$/,例如(使用可能变为m{/[^/]+$}的替代分隔符,这可能更容易阅读)。用反斜杠转义斜杠很常见,已经有了一个名字和维基百科页面:Leaning Toothpick Syndrome。在正则表达式中,如果只有一个实例需要转义斜杠,那么这可能不会被认为是阅读障碍,但如果它开始失控,并且您的语言允许像Perl一样使用替代分隔符,则应该选择首选解决方案。

1
你能给个例子吗?我有这个:perl -pi -e "s/chdir .*/chdir $ROBOT_PATH/g" startup_scripts/supervisord.conf,但是我在斜杠方面遇到了冲突。 - CMCDragonkai
请注意,在使用正则表达式进行替换(又称替代)时,要使用s而不是m。http://www.perlfect.com/articles/regex.shtml - Mashmagar
2
@CMCDragonkai perl -pi -e "s{chdir .*}{chdir $ROBOT_PATH}g" startup_scripts/supervisord.conf ...但这样可能更好:perl -pi -e 's/chdir .*/chdir $ENV{ROBOT_PATH}/g' startup_scripts/supervisord.conf因为它避免了shell插值。 - DavidO
1
除了转义字面上的 / 字符之外,另一种方法是使用正则表达式功能来指定一个字符的 ASCII 编码,可以用十六进制或八进制表示。Perl 接受八进制形式 \57(来源:https://www.regular-expressions.info/refcharacters.html)。 - lukeuser
在由lukeuser提供的页面中(谢谢),还有转义序列\Q...\E。这对我很有效。 - user3012857

11

在编程中,如果你想要使用正则表达式的斜杠 \,或者选择其他分隔符,例如使用 m#.\d# 代替 /.\d/

在 Perl 中,你可以通过在正则表达式前加上字母 m(表示匹配)来将 / 分隔符更改为几乎任何其他特殊字符。


4
如果分隔符是 /,则需要进行转义。

3
如果您正在使用C#,则不需要对其进行转义。

可能是,但这里他们正在使用 Perl。 - Toto

2
对于Java,你不需要。
eg: "^(.*)/\\*LOG:(\\d+)\\*/(.*)$" ==> ^(.*)/\*LOG:(\d+)\*/(.*)$

如果在 / 前面加上 \ ,IDE 将会告诉你:正则表达式中的 "冗余字符转义 "\/" "


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