今天我遇到了 Perl 正则表达式匹配的两种不同语法。
#I have a date string
my $time = '2012-10-29';
#Already familiar "m//":
$t =~ m/^(\d{4}-\d\d-\d\d)$/
#Completely new to me m##.
$t =~ m#^(\d{4}-\d\d-\d\d)#/
/expression/
现在和有什么区别#expression#
?
正如其他人所说,您可以在m
.
/
有一个特殊功能:您可以单独使用它,例如
$string =~ /regexp/;
相当于:
$string =~ m/regexp/;
Perl 允许您使用几乎任何字符来分隔字符串,包括正则表达式。如果您需要匹配包含大量斜杠字符的模式,这将特别有用:
$slashy =~ m/\/\//; #Bad
$slashy =~ m|//|; #Good
根据文件,其中第一个是“倾斜牙签综合症”的例子。
大多数但不是所有角色在转义时的行为方式都相同。有一个重要的例外:m?...?
是一种特殊情况,它只匹配对reset()
.
另一个例外:如果使用单引号作为分隔符,则不进行变量插值。但是,您仍然必须转义$
,因为它是与行尾匹配的特殊字符。
除了你必须在正则表达式中逃避的东西之外,什么都没有。您可以使用任何您喜欢的匹配字符。
$string = "http://example.com/";
$string =~ m!http://!;
$string =~ m#http://!#;
$string =~ m{http://};
$string =~ m/http:\/\//;
在匹配或搜索/替换运算符(分别为m
和s
)之后,您可以使用任何字符作为分隔符,例如#
您的情况。这也适用于成对的括号:s{ abc (.*) def }{ DEF $1 ABC }x
.
优点是您不必转义/
(当然是实际的分隔符)。它通常用于清晰起见,尤其是在处理路径或协议之类的事情时。
没有区别; “/”和“#”字符用作表达式的分隔符。它们只是标记表达式的“边界”,而不是表达式的一部分。理论上,您可以使用大多数非字母数字字符作为分隔符。这里是关于Perl兼容正则表达式语法的PHP手册的链接(不管是PHP手册,Regex语法都是一样的,我只是喜欢它,因为它解释得很好);阅读有关分隔符的部分