如何确定另一个正则表达式中定义的变量的数量?

时间:2010-09-05 20:11:19

标签: regex perl

例如,/(\w+) (?:\+) (\w)/ regexp必须返回2。

我必须为一个不完整的问题道歉。这是问题:输入是XML文件(事实上它并不重要:),它为字符串设置规则。目前它看起来像这样:

<string svars="3">(?:total ?|)(\d{1,2}(?:[\.,]\d{1,2}|))\/(\d{1,2}(?:[\.,]\d{1,2}|))\/(\d{1,2}(?:[\.,]\d{1,2}|))\s?sq\.\s?m\.?</string> 

需要摆脱变量svars,并以编程方式计算正则表达式中的替换变量数。

4 个答案:

答案 0 :(得分:2)

我认为您正在寻找YAPE::Regex

#!/usr/bin/perl

use strict; use warnings;
use YAPE::Regex;

my $yape = YAPE::Regex->new( qr/(\w+) (?:\+) (\w)/ );
my $extor = $yape->extract;
my $captures;

$captures++ while $extor->();

print "Number of capture groups: $captures\n";

答案 1 :(得分:1)

这将在正则表达式中找到所有捕获子表达式,表示为字符串。

@matches = "/(\\w+) (?:+) (\\w)/" =~ /(\((?!\?).*?\))/g;
print @match # All matches
print scalar @match # Number of matches (2 in this case)

正则表达式使用否定前瞻((?!...))来确保子表达式不以?开头,就像所有非捕获子表达式一样。

根据KennyTM的评论我明白,如果表达式中有转义的括号,这将不起作用。要解决这个问题,我们使用负面的lookbehind((?<!...))。一个新的正则表达式诞生了。

 /((?<!\\)\((?!\?).*?\))/g # It looks horrible.

Perl正则表达式referencetutorial,在使用正则表达式时总是很方便!

答案 2 :(得分:1)

您承认您正在使用XML。正则表达式的东西可能是你的问题的错误答案。您有一个XY problem,您可以在这里找到解决方案,而不是问题。


你真的想要发现什么?如果你没有告诉我们你想要做什么以及你为什么要这样做,那么几乎不可能对这样的问题给出一个好的答案。

模式中捕获组的数量与模式将产生的捕获数量之间存在差异。

  • 正则表达式中文字捕获组的总数。

虽然有三个捕获组,但它有一个捕获。分支重置分组对捕获重新编号,以便每个交替捕获到相同的变量:

 (?|(abc)|(def)|(ghi))

你想把它算作三个捕获组还是只产生一个捕获?

即使没有分支重置,你想如何计算这个?

 (abc)|(def)(ghi)|(jkl)

有四个捕获组,但最多只有两个捕获组将捕获任何内容。

  • 正则表达式为特定字符串生成的捕获总数。

除了前面的例子,一些捕获组可能永远不会捕获任何东西。捕获次数取决于您匹配的字符串,如下例所示:

 (abc)? 
 (abc)*
 (abc){0,5}
  • 正则表达式可能产生的最大捕获数。也就是说,对于触发最多捕获次数的字符串,该数字是多少?

答案 3 :(得分:0)

如果您这样做是为了找出给定匹配返回的捕获数量,您可以将正则表达式放在列表上下文中,它将返回所有捕获:

my @captures = $string =~ /(\w+) (?:\+) (\w)/;

然后你可以循环它们:

for my $capture (@captures) {
    print "$capture\n";
}