2014-05-23 34 views
0

我正在學習正則表達式,並且我有一個問題。知道組中哪個表達式匹配

假設我有以下xml應答器。

<xml x="5"/> 

x的值可以讓我們說foobar,所以看完我的文件,如果我能

<xml foo="6"/> 
<xml bar="7"/> 

我做了一個正則表達式匹配這個表達式和捕捉引號值。

print $1."\n" if /<xml\s(?:foo|bar)=\"(\d+)\"\/>/; 

,輸出是

6 
7 

現在的問題是,有沒有辦法知道,如果這是不是foobar是取得了正則表達式匹配?

我問這個,因爲我有兩個數組時,我需要一個推動的foo和另一個的bar

值的值我可以這樣做:

push @fooValues, $1 if /<xml\sfoo=\"(\d+)\"\/>/; 
push @barValues, $1 if /<xml\sbar=\"(\d+)\"\/>/; 

但我覺得這不是要走的路,所以我想知道是否有辦法知道哪個組匹配。

+0

'print「$ 1 $ 2 \ n」if/ /;' –

回答

1

只需使用一個捕獲,而不是一個非捕獲組:

print "$1 - $2\n" if m{<xml\s(foo|bar)="(\d+)"/>}; 

很明顯,你必須使用一些假的數據來學習正則表達式,但我希望你最終認識到,一個實際的XML解析器使用XML的最佳工具,而不是正則表達式。

+0

我很笨。謝謝:D是的,這只是爲了學習正則表達式,我需要在「普通perl」 – user2336315

1

您的問題是您正在使用非捕獲結構(?:...)。如果您只是使用圓括號創建正常捕獲組,則您將在$1中輸入foobar,並在$2中輸入數字。然後你可以檢查$1的值並適當地處理這個數字。

你甚至可以使用哈希存儲的值:

$vals[$1] = $2 

(此外,將標準的警告有關使用正則表達式解析XML也就是說,如果你是一定的XML結構你會。解析僅限於一些簡單和衆所周知的xml語言子集,正則表達式可能正常工作。)