2013-07-02 45 views
2

我試圖用這個表達式找到數字(小於第一個),但它只適用於最後一個數字......我知道需要捕獲重複組並且不重複捕獲的組,但是我不明白它是如何。通過引用捕獲一個重複組

REG:

(\d*)[a-zA-Z]+\d+(?:\.(\d*))*\.[a-zA-Z]+ 

例如

1212asdfasdfdasf101.102.103.asdsadasdasd 

1213asdfasdfdasf104.105.106.asdsadasdasd 

我想捕捉器102和103,105,106,但1212和1213也是。怎麼樣??謝謝!

+2

你正在使用哪種語言/環境/工具/正則表達式?你仍然在重複一個捕獲組(外層'*'重複'(\ d *)')。除非你使用的是.NET,否則你需要一個解決方法 –

+0

我使用visual basic 2008,我發現的最好的opcion就像獲取一個捕獲組一樣獲得.102.103,而後面的另一個組只捕獲腳本「.102.103」。 但它是兩次使用正則表達式,也許有一種形式只有一個正則表達式 – eKeR

+0

所以我們正在談論.NET?在這種情況下,請查看爲您的第二個捕獲組返回的「Group」對象。它會有一個屬性'Captures',你可以在其中獲得所有數字 –

回答

2

答案取決於您使用的是哪種語言。

對於正則表達式的最口味,沒有「簡單」的答案......例如,你可能會認爲你可以做這樣的事情:

^(?:.*?(\d+))+ 

...這將(你會希望)爲每組數字創建一個新的捕獲組。

但是,如果你有一個快速瀏覽一下(比如)java documentation,然後你會看到它說:

捕獲組通過從左至右計算其開括號編號

ie有一個固定數字,由您輸入的括號數量指定!因此,在大多數語言中,爲了完成這項工作,您需要做的不僅僅是簡單的正則表達式匹配。

也就是說,除非你可以讓你的正則表達式少廣義(和更難看),通過做這樣可怕的事情:

^(?:.*?(\d+))?(?:.*?(\d+))?(?:.*?(\d+))?(?:.*?(\d+))? 

可以,但是,正確執行此正則表達式匹配,使用.NET或Perl 6.