perl字符串匹配中/ Regex / gm和m / Regex / g之间的差异

时间:2014-03-19 18:37:47

标签: perl

perl字符串匹配($ ipAddrResult =〜/ Regex / gm)和($ ipAddrResult = ~m / Regex / g)之间有区别吗?当我在线谷歌时,我会得到第二个的解释而不是第一个。我试图编辑的文件有第一个条件。

3 个答案:

答案 0 :(得分:8)

不同地方的m意味着不同的事情。

让我们先看看第二个例子。

m//是正则表达式匹配运算符。作为一种捷径,m可以省略,所以

$foo =~ m/$pattern/;

完全相同
$foo =~ /$pattern/;

唯一需要m的情况是,您希望为模式使用/以外的分隔符。你可以做,例如

$foo =~ m!$pattern!;

$foo =~ m[$pattern];

等等,但这些都要求m在那里。

在第一个示例中,正则表达式之后的m修饰符标记,它告诉正则表达式如何表现。正则表达式标志记录在perlre手册页中,可以这样说:

  

m -   将字符串视为多行。也就是说,改变“^”和“$”   仅在左右两端匹配行的开头或结尾   在字符串中的任何位置匹配它们的字符串。

所以这个:

$foo =~ /$pattern/m;

与此相同:

$foo =~ m/$pattern/m;

与此相同:

$foo =~ m{$pattern}m;

答案 1 :(得分:5)

在表达式

/Regex/gm

" m"代表多线匹配。在表达式中:

m/Regex/g

" m"代表"匹配"而不是替换,看起来像这样:

s/Regex/replacement/g

因为匹配(与替换)是默认值,所以通常可以省略" m /"从表达的开始。换句话说," m / Regex / g"只是" / Regex / g"的同义词。

答案 2 :(得分:2)

是的,m/regex/g在语法上等同于/regex/g。也就是说,它根本不会激活/m标志。与s/foo/bar/相比,s/foo/bar/sm完全相同。名称{{1}}代表"匹配"我相信。