2013-07-10 477 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?