【问题标题】:perl regex matching failedperl 正则表达式匹配失败
【发布时间】:2012-06-11 21:23:52
【问题描述】:

我想匹配两个不同的字符串,输出应该是 $1 和 $2, 根据我在这个例子中的说法,如果 $a 是 'xy abc',那么 $1 应该是 'xy abc' 而 $2 应该是 'abc',但 'abc' 部分是 3 美元。 你能帮我写一个正则表达式, $1 应该有整个字符串,$2 应该 有第二部分。 我正在使用 perl 5.8.5。

my @data=('abc xy','xy abc');
foreach my $a ( @data) {
    print "\nPattern= $a\n";
    if($a=~/(abc (xy)|xy (abc))/) {
        print "\nMatch: \$1>$1< \$2>$2< \$3>$3<\n";
    }
}

输出:

perl test_reg.pl

Pattern= abc xy

Match: $1>abc xy< $2>xy< $3><

Pattern= xy abc

Match: $1>xy abc< $2>< $3>abc<

【问题讨论】:

  • "我正在使用 perl 5.8.5。"那是八岁。你真的应该考虑升级。

标签: regex perl


【解决方案1】:

可以做到:

(?|(abc (xy))|(xy (abc)))

为什么还要费心捕捉整件事呢?你可以使用$&amp;

my @data = ('abc xy', 'xy abc');
for(@data) {
    print "String: '$_'\n";

    if(/(?|abc (xy)|xy (abc))/) {
        print "Match: \$&='$&', \$1='$1'\n";
    }
}

【讨论】:

  • @Cylian, 引用自perlre: "这是“分支重置”模式,它具有捕获组从每个交替分支中的相同起点编号的特殊属性。”
  • +1,乍一看好像出错了!但除了我的无知什么都没有!
  • 我收到了这个错误,我想要的另外一件事 $1 应该包含 'abc xy' 或 'xy abc' 并且 $2 应该包含 'xy' 和 'abc'。正则表达式中无法识别序列 (?|...);由
  • @user87005,(?|...) 需要 Perl 5.10。如果可能的话,我建议将 perl 升级到这十年的东西。 ;-)
  • 我无法使用 5.10。 5.8 中的任何其他解决方案。
【解决方案2】:

因为只能定义$2$3的一个捕获,所以可以写

foreach my $item ( @data) {

  print "\nPattern= $item\n";

  if ($item=~/(abc (xy)|xy (abc))/) {
    printf "Match: whole>%s< part>%s<\n", $1, $2 || $3;
  }
}

给出输出

Pattern= abc xy
Match: whole>abc xy< part>xy<

Pattern= xy abc
Match: whole>xy abc< part>abc<

【讨论】:

    【解决方案3】:

    如果您可以接受比$1$2 更多的捕获变量,请使用匹配的替代分支中的子字符串。

    for ('abc xy', 'xy abc') {
      print "[$_]:\n";
    
      if (/(abc (xy))|(xy (abc))/) {
        print "  - match: ", defined $1 ? "1: [$1], 2: [$2]\n"
                                        : "1: [$3], 2: [$4]\n";
      }
      else {
        print "  - no match\n";
      }
    }
    

    输出:

    [abc xy]:
      - 匹配:1:[abc xy],2:[xy]
    [xy abc]:
      - 匹配:1:[xy abc],2:[abc]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      相关资源
      最近更新 更多