正则表达式打开和关闭字符

时间:2009-11-01 12:47:40

标签: regex

当我学习正则表达式时,我知道它们应该以斜杠字符开头和结尾(后跟修饰符)。

例如/ dog / i

然而,在许多例子中,我看到它们以其他字符开头和结尾,例如@,#和|。

例如| dog |

有什么区别?

2 个答案:

答案 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代码一样容易在眼睛上: - )

相关问题