我的问题很简单,是关于正则表达式转义的。在正则表达式中,您是否需要转义正斜杠
/
?如果需要,您该如何转义?需要考虑哪种语言或上下文环境?一些语言使用/
作为模式分隔符,因此根据语言/上下文环境,您需要对其进行转义。您可以通过在其前面添加反斜杠来对其进行转义:\/
对于某些语言(如PHP),您可以使用其他字符作为分隔符,因此不需要对其进行转义。但我所知道的是,在所有语言中,/
唯一的特殊意义就是它可能是指定的模式分隔符。
以下是几个选项:
在Perl中,您可以选择替代分隔符。您不必局限于使用m//
。您可以选择其他分隔符,例如m{}
。这样就不需要转义了。事实上,《Perl最佳实践》一书中的Damian Conway断言,m{}
是唯一应该使用的替代分隔符,这得到了Perl::Critic(在CPAN上)的支持。虽然您可以使用各种替代分隔符字符,但//
和{}
似乎是后来最清晰易懂的。但是,如果这两个选择中的任何一个导致太多的转义,请选择哪个更适合可读性。常见的示例包括m(...)
、m[...]
和m!...!
。m/\/[^/]+$/
,例如(使用可能变为m{/[^/]+$}
的替代分隔符,这可能更容易阅读)。用反斜杠转义斜杠很常见,已经有了一个名字和维基百科页面:Leaning Toothpick Syndrome。在正则表达式中,如果只有一个实例需要转义斜杠,那么这可能不会被认为是阅读障碍,但如果它开始失控,并且您的语言允许像Perl一样使用替代分隔符,则应该选择首选解决方案。perl -pi -e "s/chdir .*/chdir $ROBOT_PATH/g" startup_scripts/supervisord.conf
,但是我在斜杠方面遇到了冲突。 - CMCDragonkais
而不是m
。http://www.perlfect.com/articles/regex.shtml - Mashmagarperl -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/
字符之外,另一种方法是使用正则表达式功能来指定一个字符的 ASCII 编码,可以用十六进制或八进制表示。Perl 接受八进制形式 \57
(来源:https://www.regular-expressions.info/refcharacters.html)。 - lukeuser在编程中,如果你想要使用正则表达式的斜杠 \
,或者选择其他分隔符,例如使用 m#.\d#
代替 /.\d/
。
在 Perl 中,你可以通过在正则表达式前加上字母 m(表示匹配)来将 / 分隔符更改为几乎任何其他特殊字符。
eg: "^(.*)/\\*LOG:(\\d+)\\*/(.*)$" ==> ^(.*)/\*LOG:(\d+)\*/(.*)$
如果在 / 前面加上 \ ,IDE 将会告诉你:正则表达式中的 "冗余字符转义 "\/" "
myStr.replace(/[/:.-]+/gi, '_')
出人意料地有效。我原本以为我需要/[\/:.-]+/gi
。我无法确定这是酷还是令人困惑。 - Turbo