例如,/(\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,并以编程方式计算正则表达式中的替换变量数。
答案 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.
答案 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";
}