如何使这个perl扩展正则表达式工作?

时间:2014-12-10 04:16:34

标签: regex perl

我有以下代码


my @txt = ("Line 1. [foo]  bar",
           "Line 2.  foo   bar",
           "Line 3.  foo  [bar]"
          );
my $regex = qr/^
               Line     # Bare word
               (\d+)\.  # line number
               \[       # Open brace
               (\w+)    # Text in braces
               ]        # close brace
               .*       # slurp
               $
              /x;

my $nregex = qr/^\s*Line\s*(\d+)\.\s*\[\s*(\w+)\s*].*$/;

foreach (@txt) {
    if ($_ =~ $regex) {
        print "Lnum $1 => $2\n";
    }

    if ($_ =~ $nregex) {
        print "N Lnum $1 => $2\n";
    }
}

输出

N Lnum 1 => foo 

我期待两个正则表达式都是等价的,只捕获数组的第一行。但只有$nregex有效!

如何修复$regex以便它也可以相同地工作(使用x选项)?


修改

根据回复,更新了正则表达式并且它可以正常工作。

my $regex = qr/^       \s*
               Line    \s* # Bare word
               (\d+)\. \s* # line number
               \[      \s* # Open brace
               (\w+)   \s* # Text in braces
               ]       \s* # close brace
               .*          # slurp
               $
              /x;

1 个答案:

答案 0 :(得分:4)

你的两个表达方式不一样。您需要在第一个中包含\ s *位。 / x允许您编写整齐格式的表达式 - 您已经注意到了评论。因此,/ x版本中的空格不被认为是重要的,并且不会对任何匹配活动做出贡献。

换句话说,你的/ x版本相当于

qr/^Line(\d+)\.\[(\w+)].*$/x

顺便说一下,只有一个普通的空间而不是\ s *或\ s +也会失败很多次;您的示例数据在几个地方包含两个彼此相邻的空格。这两个地方不匹配一个空格。

最后提示:当你必须在某个位置至少有一个空格时,你应该使用\ s +来强制执行至少一个空格。一旦你知道可能的话,你肯定可以找出在你的模式中可能有用的地方。