【发布时间】:2014-03-19 18:37:46
【问题描述】:
在 perl 字符串匹配中 ($ipAddrResult =~ /Regex/gm) 和 ($ipAddrResult =~ m/Regex/g) 有区别吗?当我在网上搜索时,我得到了第二个而不是第一个的解释。我尝试编辑的文件具有第一个条件。
【问题讨论】:
标签: perl
在 perl 字符串匹配中 ($ipAddrResult =~ /Regex/gm) 和 ($ipAddrResult =~ m/Regex/g) 有区别吗?当我在网上搜索时,我得到了第二个而不是第一个的解释。我尝试编辑的文件具有第一个条件。
【问题讨论】:
标签: perl
ms 在不同的地方意味着不同的东西。
让我们先看第二个例子。
m// 是正则表达式匹配运算符。作为快捷方式,m 可以省略,所以
$foo =~ m/$pattern/;
完全一样
$foo =~ /$pattern/;
唯一需要m 的情况是,如果您想为您的模式使用/ 以外的分隔符。例如,您可以这样做
$foo =~ m!$pattern!;
或
$foo =~ m[$pattern];
等等,但这些都需要m 存在。
在第一个例子中,正则表达式后面的m 是一个修饰符标志,它告诉正则表达式如何表现。正则表达式标志记录在perlre 手册页中,其中有这样的说法:
米 - 将字符串视为多行。也就是说,将“^”和“$”从 仅在左端和右端匹配行的开始或结束 字符串以匹配它们在字符串中的任何位置。
所以这个:
$foo =~ /$pattern/m;
和这个是一样的:
$foo =~ m/$pattern/m;
和这个一样:
$foo =~ m{$pattern}m;
【讨论】:
\m 修饰符很重要。例如:"foo\nbar\n" =~ /foo$/ 为假,但"foo\nbar\n" =~ /foo$/m 为真。
在表达式中
/Regex/gm
“m”代表多行匹配。在表达式中:
m/Regex/g
“m”代表“匹配”而不是替换,如下所示:
s/Regex/replacement/g
因为匹配(相对于替换)是默认设置,您通常可以从表达式的开头省略“m/”。换句话说,“m/Regex/g”只是“/Regex/g”的同义词。
【讨论】:
是的,m/regex/g 在语法上等同于 /regex/g。也就是说,它根本不会激活/m 标志。与s/foo/bar/ 相比,它与s/foo/bar/s 完全不同。我相信m 这个名字代表“匹配”。
【讨论】:
m 是可选的,基本上是多余的。但可以肯定的是,它们在语义上是等价的。