8

今天我遇到了 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#

4

5 回答 5

9

正如其他人所说,您可以在m.

/有一个特殊功能:您可以单独使用它,例如

$string =~ /regexp/;

相当于:

$string =~ m/regexp/;
于 2012-10-18T08:30:58.050 回答
9

Perl 允许您使用几乎任何字符来分隔字符串,包括正则表达式。如果您需要匹配包含大量斜杠字符的模式,这将特别有用:

$slashy =~ m/\/\//;   #Bad
$slashy =~ m|//|;   #Good

根据文件,其中第一个是“倾斜牙签综合症”的例子。

大多数但不是所有角色在转义时的行为方式都相同。有一个重要的例外:m?...?是一种特殊情况,它只匹配对reset().

另一个例外:如果使用单引号作为分隔符,则不进行变量插值。但是,您仍然必须转义$,因为它是与行尾匹配的特殊字符。

于 2012-10-18T08:37:19.597 回答
3

除了你必须在正则表达式中逃避的东西之外,什么都没有。您可以使用任何您喜欢的匹配字符。

$string = "http://example.com/";
$string =~ m!http://!;
$string =~ m#http://!#;
$string =~ m{http://};
$string =~ m/http:\/\//;
于 2012-10-18T08:18:35.513 回答
3

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

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

于 2012-10-18T08:20:40.020 回答
1

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

于 2012-10-18T08:22:26.823 回答