【问题标题】:Difference between /Regex/gm and m/Regex/g in perl string matchingperl 字符串匹配中 /Regex/gm 和 m/Regex/g 的区别
【发布时间】:2014-03-19 18:37:46
【问题描述】:

在 perl 字符串匹配中 ($ipAddrResult =~ /Regex/gm) 和 ($ipAddrResult =~ m/Regex/g) 有区别吗?当我在网上搜索时,我得到了第二个而不是第一个的解释。我尝试编辑的文件具有第一个条件。

【问题讨论】:

    标签: perl


    【解决方案1】:

    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 为真。
    【解决方案2】:

    在表达式中

    /Regex/gm
    

    “m”代表多行匹配。在表达式中:

    m/Regex/g
    

    “m”代表“匹配”而不是替换,如下所示:

    s/Regex/replacement/g
    

    因为匹配(相对于替换)是默认设置,您通常可以从表达式的开头省略“m/”。换句话说,“m/Regex/g”只是“/Regex/g”的同义词。

    【讨论】:

      【解决方案3】:

      是的,m/regex/g 在语法上等同于 /regex/g。也就是说,它根本不会激活/m 标志。与s/foo/bar/ 相比,它与s/foo/bar/s 完全不同。我相信m 这个名字代表“匹配”。

      【讨论】:

      • 注意:这是语义等价,而不是句法等价。
      • 嗯,我想说最初的m 是可选的,基本上是多余的。但可以肯定的是,它们在语义上是等价的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多