Perl正则表达式分隔符/.../和#...之间的区别

时间:2012-10-18 08:16:58

标签: regex perl syntax

今天我遇到了两种不同的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#之间有什么区别?

5 个答案:

答案 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)

匹配或搜索/替换运算符(分别为ms)之后,您可以使用任何字符作为分隔符,例如在您的情况下#。这也适用于括号对:s{ abc (.*) def }{ DEF $1 ABC }x

优点是您不必转义/(当然是实际的分隔符)。它通常用于清晰,特别是在处理路径或协议等事情时。

答案 4 :(得分:1)

没有区别; “/”和“#”字符用作表达式的分隔符。它们只是标记表达式的“边界”,但不是表达式的一部分。理论上,您可以使用大多数非字母数字字符作为分隔符。 Here是一个链接到PHP手册(无论是PHP手册,Regex语法是否相同,我只是喜欢它,因为它解释得很好)与Perl兼容的正则表达式语法;阅读有关分隔符的部分