perl - 如何获得最低匹配的 captureno?

标签 perl

如何在正则表达式中获得最低匹配组号?

假设有一个正则表达式

/(a(b))|(b(1))|(c(4))/...

例如输入字符串是 "b1",最低匹配组没有 2. ($2)

例如输入字符串是 "c4",最低匹配组没有 5. ($5)

例如输入字符串是 "ab",最低匹配组没有 1. ($1)

我有一个解决方案,但效率不高。 谢谢大家的尝试。 真正的问题是效率。许多人提供了我发现的类似解决方案。 问题是线性时间搜索最低组。 O(N) 其中 n 是捕获组的数量。 我想知道是否有更快的方法。 O(1) 这就是这个问题的目的。 我希望 Perl 有一个隐藏的特性来获得这个值。估计没有。

同时我自己找到了解决方案就在这里..

/(a(b)(??{ $first=1;""}))|(b(1)(??{ $first=2;""}))|(c(4)( ??{ $first=5;""}))/

找出 $first 的时间是 O(1)。

if (@matches = $conv::content =~/$conv::trtree{convertsourceregqr}[$conversionno]/)
      {

        my $firstno;
        my $c = 0;
        for my $m (@matches)
        {
          if (defined $m)
          {
            $firstno=$c;
            last;
          }
          $c++;
        }**strong text****strong text**

最佳答案

这与您的问题并不完全匹配,但它可能会解决您的实际问题(或者 future 读者的问题)。

编辑(2012 年 12 月 10 日):

还有一个选项,the special construct (?|)将交替重组编号,使编号保持一致。这无助于识别匹配的组,但会确保匹配项在 $1$2 中。如果您需要知道哪些匹配的命名捕获(如下)是可行的方法。

#!/usr/bin/env perl

use strict;
use warnings;

foreach my $v ('ab', 'b1', 'c4') {
  print "Input: $v\n";
  next unless $v =~ /(?|(a(b))|(b(1))|(c(4)))/;
  print "$1 => $2\n";
}

原创 也许您想使用 named captures以减轻理解匹配项的负担。命名的捕获结果放在 %+ 散列中,因此更容易内省(introspection)。

#!/usr/bin/env perl

use strict;
use warnings;

foreach my $v ('ab', 'b1', 'c4') {
  print "Input: $v\n";
  next unless $v =~ /(?<a>a(?<ab>b))|(?<b>b(?<b1>1))|(?<c>c(?<c4>4))/;
  foreach my $key (sort keys %+) {
    next unless defined $+{$key};
    print "\t$key => $+{$key}\n";
  }
}

打印

Input: ab
    a => ab
    ab => b
Input: b1
    b => b1
    b1 => 1
Input: c4
    c => c4
    c4 => 4

编辑

事实上,对于这样的交替,也许您只想使用重复的名称!

#!/usr/bin/env perl

use strict;
use warnings;

foreach my $v ('ab', 'b1', 'c4') {
  print "Input: $v\n";
  next unless $v =~ /(?<outer>a(?<inner>b))|(?<outer>b(?<inner>1))|(?<outer>c(?<inner>4))/;
  print "\touter => $+{outer}\n";
  print "\tinner => $+{inner}\n";
}

打印

Input: ab
    outer => ab
    inner => b
Input: b1
    outer => b1
    inner => 1
Input: c4
    outer => c4
    inner => 4

关于perl - 如何获得最低匹配的 captureno?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13689167/

相关文章:

perl - 这个 Perl one liner 如何检查目录是否为空?

perl - 无法使用twitter api上传图片

perl - Linux:如何安装 DBD::Pg 模块?

regex - Perl 中捕获组的可选性和 "or"

perl - Dreamhost 上的 Gitolite

perl - Attribute::Handler 的使用与要求行为

regex - 如何在 Perl 中检索整数的序数后缀(如 st、nd、rd、th)

perl - 在 Perl 中并行读取 2 个文件时的性能

perl - 在 Ubuntu 中从 perl 脚本运行 Tcl(期望)脚本的命令

regex - Perl 正则表达式/foo|bar/否定