2011-07-12 91 views
0

在使用正則表達式時遇到問題。我有以下格式的代碼。正則表達式匹配子字符串順序無關

(01)123456789(17)987654321 

現在我想(01)後捕捉到數字的命名組:group01(17)在namedGroup後面的數字:group17

的問題是,代碼可以在不同的順序是這樣的:

(17)987654321(01)123456789 

命名的組應包含相同的內容。

有什麼想法?

謝謝馬可

+1

你使用什麼語言? – loosecannon

+0

如果這些答案有效,你能接受嗎? – loosecannon

回答

1

在Python,PCRE和PHP

(?:(?<=\(17\))(?<group17>\d+)|(?<=\(01\))(?<group01>\d+)|.)+ 

.NET支持上述語法,這一個:

(?:(?<=\(17\))(?'group17'\d+)|(?<=\(01\))(?'group01'\d+)|.)+ 
0

你不說什麼語言,他們都有自己的怪癖。但是,如果()後總是有9位數字,這樣的事情應該可以工作。 (紅寶石)

沒有組,但在我看來,這樣稍微更清楚一點,可能不適合你。

string = "(01)123456789(17)987654321" 
group17 = string =~ /\(17\)\d{9}/ 
group01 = string =~ /\(01\)\d{9}/ 

string[group17+4,9] 
string[group01+4,9] 

編輯: 與Ruby 1.9的命名捕捉組:

string = "(01)123456789(17)987654321" 
if string =~ /\(17\)(?<g17>\d{9})/ 
    match = Regexp.last_match 
    group17 = match[:g01] 
end 
if string =~ /\(01\)(?<g01>\d{9})/ 
    match = Regexp.last_match 
    group01 = match[:g01] 
end 
0

尋找這樣的事情?

(01|17)(\d*?)(01|17)(\d*?) 

預期匹配: 0 =>在大多數情況下,整個匹配 1 => 01或17 2 =>第一十進制字符串 3 =>第二01或17 4 =>第二十進制字符串

告訴我,如果有幫助。

1

這爲我工作:

(?<group01>\(01\))[0-9]{9}|(?<group17>\(17\))[0-9]{9} 
1

每個人似乎都被硬編碼 「01」 和 「17」。這裏有一個更通用的解決方案:

while (my $data =~ /\((\d+)\)(\d+)/g) { 
    my $group_number = $1; 
    my $group_data = $2; 
    $group{$group_number} = $group_data; 
} 

只要你在你的數據不滿意(numbers)numbers模式匹配算法,它會抓住每一個連續。在這個Perl代碼片段中,它將每個組的數據存儲在一個鍵入組號的散列上。

0

有些人在遇到問題時會想:「我知道,我會用正則表達式。」現在他們有兩個問題。 - 傑米Zawinski

Glib引號一邊,正則表達式似乎是矯枉過正。Python代碼:

string = "(17)987654321(01)123456789" 

substrings = [s for s in string.split("(") if len(s) > 0] 

results = dict() 

for substring in substrings: 
    substring = substring.split(")") 
    results["group" + substring[0]] = substring[1] 

print results 

>>> {'group17': '987654321', 'group01': '123456789'}