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


106

我的问题很简单,它涉及正则表达式转义。您是否必须/在正则表达式中转义正斜杠?您将如何去做呢?


1
您使用哪种语言/正则表达式实现?
浓汤

有趣的是,我一直在寻找Javascript的问题。但是后来我的IDE说我正在使用不必要的转义符。因此myStr.replace(/[/:.-]+/gi, '_')使我惊讶的是有效的。我以为我会需要的/[\/:.-]+/gi。我不能确定这是很酷还是令人困惑。
Turbo

Answers:


90

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


38

以下是一些选择:

  • 在Perl中,您可以选择备用定界符。您不仅仅局限于m//。您可以选择其他,例如m{}。这样就不必转义。实际上,“ Perl最佳实践”中的Damian Conway断言,这m{}是应该使用的唯一替代分隔符,并且Perl :: Critic(在CPAN上)对此进行了增强。虽然你可以逃脱使用各种其它分隔符,//并且{}似乎是最明确的,以对后来破译。但是,如果这些选择中的任何一个导致太多的转义,请选择最适合自己的可读性。常见的例子是m(...)m[...]m!...!

  • 如果您无法或不希望使用替代定界符,则可以使用反斜杠转义正斜杠: m/\/[^/]+$/例如(使用替代分隔符m{/[^/]+$},该分隔符可能变为,可以更清楚地阅读)。用反斜杠转义斜杠很常见,足以赢得一个名字和一个维基百科页面:倾斜牙签综合症。在只有一个实例的正则表达式中,转义斜线可能不会上升到被认为易读性的水平,但是如果它开始失控,并且如果您的语言像Perl一样允许替代分隔符,那是首选的解决方案。


1
能给我举个例子吗?我有这个:perl -pi -e "s/chdir .*/chdir $ROBOT_PATH/g" startup_scripts/supervisord.conf而且我正与正斜杠发生冲突。
CMCDragonkai 2013年

请注意,使用正则表达式进行替换(aka替代)时,请使用s,而不是mperlfect.com/articles/regex.shtml
Mashmagar 2014年

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因为它避免了外壳插值。
DavidO 2015年

1
转义文字/字符的替代方法是使用正则表达式功能,该功能通过十六进制或八进制的ASCII编码指定字符。Perl的接受八进制形式\57(源regular-expressions.info/refcharacters.html
lukeuser

在lukeuser链接的页面(谢谢)中,还有转义序列\ Q ... \ E。这对我有用。
user3012857

11

使用反斜杠\或选择其他定界符,即m#.\d#代替/.\d/ “在Perl中,如果您将字母m开头(用于匹配),则可以将/正则表达式定界符更改为几乎任何其他特殊字符;”


6

如果定界符是/,则需要转义。


0

如果使用的是C#,则无需转义。


可能是,但是这里他们在使用perl。
Toto

0

对于Java,则不需要。

eg: "^(.*)/\\*LOG:(\\d+)\\*/(.*)$" ==> ^(.*)/\*LOG:(\d+)\*/(.*)$

如果将\放在/前面。IDE会告诉您“ ReGex中的冗余字符转义符“ \ /””

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.