2013-07-10 269 views
3

拍摄组的最大数量,如何找到拍摄组在正则表达式的最大值是多少?我知道我可以使用$ 1,$ 2等来引用第一,第二等捕获的组。但是,我如何找到这些组的最大数量?通过捕获的组,我的意思是由一个正则表达式匹配的字符串。例如:如果正则表达式是(a +)(b +)c +,则字符串“abc”与该正则表达式匹配。第一个被捕的组将是1美元,第二个将是2美元。在考虑在Perl正则表达式Perl的正则表达式

回答

4

amon暗示在回答这个问题时,他提到了%+哈希值。但是,你需要什么是@+数组:

@+

此数组保存上次成功子匹配的末端的偏移量在当前活跃的动态范围。 $ + [0]是整个匹配结束字符串的偏移量。这与pos函数在匹配的变量上调用时返回的值相同。该数组的第n个元素保存第n个子匹配的偏移量,因此$ + 1是$ 1结束的偏移量,$ + [2]是$ 2结束的偏移量,以此类推。 您可以使用$#+确定上次成功匹配的子组数。请参阅为@ - 变量提供的示例。 [enphasis加入]

$re = "(.)" x 500; 
$str = "a" x 500; 
$str =~ /$re/; 
print "Num captures is $#+";  # outputs "Num captures is 500" 
0

捕获的数量是无限的用途不同。尽管可以通过变量访问9个捕获,但可以使用更多捕获组。

如果你有以上几个捕获组的更多,你可能想使用命名捕获,像

my $str = "foobar"; 

if ($str =~ /(?<name>fo+)/) { 
    say $+{name}; 
} 

输出:foo。您可以通过%+哈希访问命名捕获的值。

+0

我知道捕获的数目是无限的。但它不能无限的给定的正则表达式的权利?通过捕获的组,我的意思是与给定的字符串相匹配的pamental中的正则表达式部分。 – Arjun

+1

'$ 10','$ 11',[etc.](http://stackoverflow.com/a/12117671/168657)也适用于超过9个组的情况。 – mob

0

您可以使用如下代码给你捕获组的计数:

$regex = qr/..../; # Some arbitrary regex with capture groups 
my @capture = '' =~ /$regex|()/; # A successful match incorporating the regex 
my $groups_in_my_regex = scalar(@capture) - 1; 

它的工作方式是,它执行的匹配必须成功,然后检查许多捕获组是如何创建的。 (额外一个创建由于尾随|()

编辑:事实上,它似乎没有必要添加额外的捕获组就只要匹配是保证成功,那么阵列将包含每一个拍摄组的条目

因此,我们可以改变第二和第三行:

my @capture = '' =~ /$regex|/; # A successful match incorporating the regex 
my $groups_in_my_regex = scalar(@capture); 

参见:
Count the capture groups in a qr regex?