在使用正則表達式時遇到問題。我有以下格式的代碼。正則表達式匹配子字符串順序無關
(01)123456789(17)987654321
現在我想(01)
後捕捉到數字的命名組:group01
和(17)
在namedGroup後面的數字:group17
。
的問題是,代碼可以在不同的順序是這樣的:
(17)987654321(01)123456789
命名的組應包含相同的內容。
有什麼想法?
謝謝馬可
在使用正則表達式時遇到問題。我有以下格式的代碼。正則表達式匹配子字符串順序無關
(01)123456789(17)987654321
現在我想(01)
後捕捉到數字的命名組:group01
和(17)
在namedGroup後面的數字:group17
。
的問題是,代碼可以在不同的順序是這樣的:
(17)987654321(01)123456789
命名的組應包含相同的內容。
有什麼想法?
謝謝馬可
在Python,PCRE和PHP
(?:(?<=\(17\))(?<group17>\d+)|(?<=\(01\))(?<group01>\d+)|.)+
.NET支持上述語法,這一個:
(?:(?<=\(17\))(?'group17'\d+)|(?<=\(01\))(?'group01'\d+)|.)+
你不說什麼語言,他們都有自己的怪癖。但是,如果()後總是有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
尋找這樣的事情?
(01|17)(\d*?)(01|17)(\d*?)
預期匹配: 0 =>在大多數情況下,整個匹配 1 => 01或17 2 =>第一十進制字符串 3 =>第二01或17 4 =>第二十進制字符串
告訴我,如果有幫助。
這爲我工作:
(?<group01>\(01\))[0-9]{9}|(?<group17>\(17\))[0-9]{9}
每個人似乎都被硬編碼 「01」 和 「17」。這裏有一個更通用的解決方案:
while (my $data =~ /\((\d+)\)(\d+)/g) {
my $group_number = $1;
my $group_data = $2;
$group{$group_number} = $group_data;
}
只要你在你的數據不滿意(numbers)numbers
模式匹配算法,它會抓住每一個連續。在這個Perl代碼片段中,它將每個組的數據存儲在一個鍵入組號的散列上。
有些人在遇到問題時會想:「我知道,我會用正則表達式。」現在他們有兩個問題。 - 傑米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'}
你使用什麼語言? – loosecannon
如果這些答案有效,你能接受嗎? – loosecannon