当我学习正则表达式时,我知道它们应该以斜杠字符开头和结尾(后跟修饰符)。
例如/ dog / i
然而,在许多例子中,我看到它们以其他字符开头和结尾,例如@,#和|。
例如| dog |
有什么区别?
答案 0 :(得分:5)
这种情况从一种正则表达式风味到下一种都有很大差异。例如,JavaScript只允许使用正斜杠(或solidus)作为正则表达式文字的分隔符,但在Perl中,您可以使用几乎任何标点符号 - 在更新版本中,包括非{{{{{{ 1}}和«
。当您使用平衡对中的字符(如大括号,圆括号或上面的双箭头引号)时,必须正确平衡它们:
»
如果使用m«\d+»
s{foo}{bar}
前缀,Ruby还允许您选择不同的分隔符,但我不知道是否扩展为平衡分隔符或非ASCII字符。许多语言根本不支持正则表达式文字;你只需将正则表达式写成字符串文字,例如:
%r
请注意Java版本中的双反斜杠。这是必要的,因为字符串被处理两次:一次由Java编译器处理,一次由Pattern类的r'\d+' // Python
@"\d+" // C#
"\\d+" // Java
方法处理。大多数其他语言提供了一种“原始”或“逐字”形式的字符串文字,这些形式几乎消除了这种反斜杠。
然后是PHP。它的compile()
正则表达式函数构建在PCRE库之上,它模仿Perl的正则表达式,包括各种各样的分隔符。但是,PHP本身并不支持正则表达式文字,因此您必须将它们编写为嵌入字符串文字中的正则表达式文字,如下所示:
preg
最后,请注意,即使那些支持正则表达式文字的语言通常也不提供Perl的'/\d+/g' // match modifiers go after the slash but inside the quotes
"{\\d+}" // double-quotes may or may not require double backslashes
构造。最接近的等价函数是一个函数调用,它将正则表达式文字作为第一个参数,将字符串文字作为第二个参数,如下所示:
s/…/…/
答案 1 :(得分:4)
某些RE引擎允许您使用不同的字符,以避免在RE中使用时转义这些字符。
例如,使用sed
,您可以使用以下任一项:
sed 's/\/path\/to\/directory/xx/g'
sed 's?/path/to/directory?xx?g'
后者通常更具可读性。前者有时被称为“倾斜牙签”。使用Perl,您可以使用以下任一项:
$x =~ /#!\/usr\/bin\/perl/;
$x =~ m!#\!/usr/bin/perl!;
但我仍然认为后者在眼睛上更容易,特别是当RE变得非常复杂时。好吧,像任何 Perl代码一样容易在眼睛上: - )