【问题标题】:Perl regex with exclamation marks带感叹号的 Perl 正则表达式
【发布时间】:2012-02-16 11:35:12
【问题描述】:

你如何定义/解释这个 Perl 正则表达式:

$para =~ s!//!/!g;

我知道 s 表示搜索,g 表示全局(搜索),但不确定感叹号 ! 和额外的斜杠 / 是如何适应的(因为我认为模式看起来更像s/abc/def/g)。

【问题讨论】:

    标签: regex perl


    【解决方案1】:

    Perl 的正则表达式运算符smtr(认为它不是真正的正则表达式运算符)允许您使用任何符号作为分隔符。

    这意味着你不必使用你可以使用的/,就像你的问题!

    # the regex
    s!//!/!g
    

    表示搜索并用'/'替换'//'的所有实例

    你可以写和

    一样的东西
    s/\/\//\/g 
    

    s#//#/#g
    

    s{//}{/}g
    

    如果你真的想要,但是你可以看到第一个带有所有反斜杠的,非常难以理解并且更麻烦。

    更多信息可以在perldoc's perlre找到

    【讨论】:

      【解决方案2】:

      替换正则表达式(和其他正则表达式运算符,如m///)可以将任何标点符号作为分隔符。这省去了在正则表达式中转义元字符的麻烦。

      如果你想替换斜线,写起来会很尴尬:

      s/\/\//\//g;
      

      这就是为什么你可以写作

      s!//!/!g; 
      

      ...相反。见http://perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators

      不,s/// 是替代品。 m/// 是搜索,尽管我相信预期的助记符是“匹配”。

      【讨论】:

        【解决方案3】:

        感叹号是分隔符; perl 允许您在合理的范围内选择您想要的任何字符。该语句等效于(更丑陋的)s/\/\//\//g——也就是说,它将// 替换为/

        【讨论】:

        • 仅限于那些合理的字符。您可以使用任何[^\s\w] 字符作为分隔符。如果是四种 ASCII 开括号类型之一,则对应的关闭版本是 mate;否则就是同一个角色完成它。有很多不合理但合法的选择。没有人会感谢您选择REVERSE SOLIDUS,也不会感谢您选择SEMICOLON
        猜你喜欢
        • 1970-01-01
        • 2018-06-04
        • 1970-01-01
        • 2012-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-18
        相关资源
        最近更新 更多