【问题标题】:Curly brackets in regexps with Perl使用 Perl 的正则表达式中的大括号
【发布时间】:2014-03-17 12:18:37
【问题描述】:

只是想了解正则表达式。以下是部分代码。它逐行读取文件,并具有以下表达式以在任一端触发空白行。

\A 匹配行首
\s+ 一个或多个空格
\z 匹配行尾行的

while (<$fh>) 
{
  s{\A\s+}{};
  s{\s+\z}{};
}

我苦苦挣扎的部分是大括号。我能在它们身上找到的唯一文档表明它们充当了乘数。 如果行首和空格替换为空,我会阅读 s{\A\s+}{}; ,但这是我的猜测。我希望确认这一点以及大括号在此正则表达式中的含义

【问题讨论】:

    标签: regex perl


    【解决方案1】:

    devnull 已经给出了正确的答案,但我觉得还有很多东西要补充而不是评论。

    s{}{} 只是s/// 替换运算符,但与不同的分隔符一起使用。您几乎可以使用任何字符作为分隔符,包括不同类型的平衡括号,例如s#foo#bar#s[foo][bar]

    您可以使用它来避免在匹配字符串中转义分隔符。比如匹配路径时:

    s#/foo/bar/baz#/foo/baz/bax#
    

    使用默认斜线分隔符/,看起来比等效的更好:

    s/\/foo\/bar\/baz/\/foo\/baz\/bax/
    

    老实说,这很令人困惑。

    在您的情况下,没有真正的理由使用不同的分隔符,因此我认为最好使用原始分隔符进行替换:

    s/\A\s+//
    s/\s+\z//
    

    【讨论】:

    • 我想知道在不涉及替换的情况下是否有类似的解决方案,例如@array=/and.*?that's all/。如果匹配字符串中有(),则不匹配。
    【解决方案2】:

    {} 指的是一对分隔符。

    您可能想参考Quote and Quote-like Operators

     Customary Generic Meaning  Interpolates
                s{}{}  Substitution yes*
    

    举个例子:

    $ echo foo 42 bar | perl -pe 's{42}{84}'
    foo 84 bar
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多