今天我遇到了两种不同的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#
之间有什么区别?
答案 0 :(得分:9)
正如其他人所说,您可以在m
之后使用任何分隔符。
/
有一个特殊功能:您可以单独使用它,例如
$string =~ /regexp/;
相当于:
$string =~ m/regexp/;
答案 1 :(得分:7)
Perl允许您使用几乎任何字符来分隔字符串,包括正则表达式。如果您需要匹配包含大量斜杠字符的模式,这将特别有用:
$slashy =~ m/\/\//; #Bad
$slashy =~ m|//|; #Good
根据the documentation,第一个是“倾斜牙签综合征”的例子。
大多数但不是所有字符在转义时的行为方式相同。有一个重要的例外:m?...?
是一种特殊情况,只能在调用reset()
之间匹配一次。
另一个例外:如果单引号用于分隔符,则不进行变量插值。但是,你仍然必须逃避$
,因为它是一个匹配行尾的特殊字符。
答案 2 :(得分:3)
除了你必须在正则表达式中逃脱之外什么都没有。你可以使用你喜欢的任何一对匹配的字符。
$string = "http://example.com/";
$string =~ m!http://!;
$string =~ m#http://!#;
$string =~ m{http://};
$string =~ m/http:\/\//;
答案 3 :(得分:3)
匹配或搜索/替换运算符(分别为m
和s
)之后,您可以使用任何字符作为分隔符,例如在您的情况下#
。这也适用于括号对:s{ abc (.*) def }{ DEF $1 ABC }x
。
优点是您不必转义/
(当然是实际的分隔符)。它通常用于清晰,特别是在处理路径或协议等事情时。
答案 4 :(得分:1)
没有区别; “/”和“#”字符用作表达式的分隔符。它们只是标记表达式的“边界”,但不是表达式的一部分。理论上,您可以使用大多数非字母数字字符作为分隔符。 Here是一个链接到PHP手册(无论是PHP手册,Regex语法是否相同,我只是喜欢它,因为它解释得很好)与Perl兼容的正则表达式语法;阅读有关分隔符的部分