使用Perl的regexp中的卷曲括号

时间:2014-03-17 12:18:38

标签: regex perl

只是试图让我的头围绕regexps。以下是代码的一部分。它逐行读取文件,它具有以下表达式,以便在任一端触发空白行。

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

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

我正在努力的部分是大括号。我能找到的唯一文件表明它们可以作为乘数。 我读了 s {\ A \ s +} {}; 如果行的开头和空格都没有替换,但这是我的猜测。我希望确认这个以及这个正则表达式中花括号的含义

2 个答案:

答案 0 :(得分:6)

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//

答案 1 :(得分: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