2009-05-27 21 views

回答

1

有兩個特殊數組@@和@ +,其中包含起始位置 和成功匹配的結束位置。匹配完成後,使用數組長度 。

靜態分析:要知道需要解析正則表達式字符串的所有對。 計算所有未關閉的開放支架,其中有一個關閉的支架。

+1

未轉義的開頭括號中沒有「?:」後面的(?:text)無法捕獲 – 2009-05-27 11:09:04

4

你想知道有多少場比賽有或有多少組括號?如果你想能夠計算括號,那麼你可能需要看看如Text::Balanced這樣的模塊來分析分隔文本。

在另一方面,如果你想知道如何匹配有你會過得更好執行在列表環境正則表達式:

my @matches = $string_to_match_on =~ /(\w(\w))/; 

列表的大小會給你匹配的數量:

my $count = @matches; 

(作爲標量上下文中的列表或數組給出列表或數組的大小)。

+0

我試圖找出捕獲次數(可能的匹配)。 我很謹慎試圖計算括號作爲邊緣案例的藉口,例如 「\\(」或[(] – justintime 2009-05-27 10:17:11

+0

)我認爲您可能需要一個「正確的」解析器,例如Text :: Balanced,或者您可以謹慎風並使用Parse :: RecDescent編寫一個你是對的,計算括號不太可能工作很長時間你是否正在處理正則表達式作爲輸入到你的代碼中? – 2009-05-27 11:32:47

1

因爲並非所有的括號都沒有捕獲 - 例如(?:...),(?= ...)等等,這並不是很簡單。

一般來說,記住你隨時可以:

my @catch_all = $string =~ m/......................./; 

,然後只檢查@catch_all;

2

重要的是要知道爲什麼你需要這個。

請問YAPE::Regex有幫助嗎?

編輯:這裏是示範:

#!/usr/bin/perl 

use strict; 
use warnings; 

use Data::Dumper; 
use YAPE::Regex; 

my $regex = qr/^(A)(B)(C)[0-9]+(\w+)$/; 

my $parser = YAPE::Regex->new($regex); 

my $n_captures; 

while (my $node = $parser->next) { 
    if ($parser->state =~ /^capture\(([0-9]+)\)$/) { 
     $n_captures = $1; 
    } 
} 

print "$n_captures\n"; 


C:\Temp> t 
4