2015-03-03 39 views
1

我有一個字符串正則表達式的鍛鍊,解析意外搞砸串

str = (größen xs-xxl)s+m+l+xl+xxl+xxxl(Solid-Farben)Dark Grey (2890)+Black (9000)+Mocca (5050)+Cognac (5048) 

由四個部分組成:

1: (größen xs-xxl) 
2: s+m+l+xl+xxl+xxxl 

3: (Solid-Farben) 
4: Dark Grey (2890)+Black (9000)+Mocca (5050)+Cognac (5048) 

本來,字符串描述符color-和大小的變化,並且總是以相同的方式放在一起:

1)第一個鍵(名稱的大小或顏色類別,這次是在括號
2)所述第一密鑰的值 「größenXS-XXL」
,通過加號
3)第二密鑰(此時「固法本」)圓括號中
分離4)第二個鍵的值由加號分隔。不幸的是,作爲值串的一部分還有空格和括號。

所有部件都粘在一起,我的工作是對這些東西進行逆向工程。
到目前爲止,我已經制作這個表達式時考慮以下思路:

首先我需要括號裏面的鍵名,所以得到的一切括號內:

(\([^+)]+\)) 

因爲這也抓住了數字屬於第二密鑰的值(括號內例如(2890),第二部分是用於右括號之後的加號或線端的負前向斷言測試。

(?!\+|$) 

這些放在一起抓住我的字符串的關鍵組成部分:

regex = /(\([^+)]+\))(?!\+|$)/ 
1.9.3-p374 :085 > str.scan regex 
=> [["(größen xs-xxl)"], ["(Solid-Farben)"]] 

現在我越來越絕望努力也提取相應的值。當然,我可以迭代關鍵數組,分割源字符串並處理收集的結果 - 但這非常難看。
一個更優雅的方法是雙擊正則表達式,並在這兩者之間取得尾隨增值部分添加(+)

regex = (\([^+)]+\))(?!\+|$)(.+?)(\([^+)]+\))(.+?)$ 
1.9.3-p374 :096 > str.scan regex 
=> [["(größen xs-xxl)", "s+m+l+xl+xxl+xxxl", "(Solid-Farben)", "Dark Grey (2890)+Black (9000)+Mocca (5050)+Cognac (5048)"]] 

,這正是我所想要的。但是,儘管是幾乎醜如後處理的第一正則表達式,此解決方案不考慮到有可能是第三個鍵,用相應的值,也加入到原始字符串:

1: (größen xs-xxl) 
2: s+m+l+xl+xxl+xxxl 

3: (Solid-Farben) 
4: Dark Grey (2890)+Black (9000)+Mocca (5050)+Cognac (5048) 

5: (NEW DIMENSION) 
6: V-NECK+O-NECK+SIZE(tall)+SIZE(short) 

str2 = (größen xs-xxl)s+m+l+xl+xxl+xxxl(Solid-Farben)Dark Grey (2890)+Black (9000)+Mocca (5050)+Cognac (5048)(NEW DIMENSION)V-NECK+O-NECK+SIZE(tall)+SIZE(short) 

這打破每一種方式,因爲我現在需要三個捕獲。當然,我的原始正則表達式只能匹配兩個事件,但如果我不知道有多少部分「粘在一起」呢?

難道某人腦子比我大,請賜教嗎?我希望看到這樣做更加優雅,並且作爲附加功能,可以在將「粘合在一起」之前擴展到原始零件的無限次出現(甚至只有一次)。 (:

回答

1

你可以試試下面string.scan功能

> str = "(größen xs-xxl)s+m+l+xl+xxl+xxxl(Solid-Farben)Dark Grey (2890)+Black (9000)+Mocca (5050)+Cognac (5048)(NEW DIMENSION)V-NECK+O-NECK+SIZE(tall)+SIZE(short)" 
> str.scan(/\([^()]*\).*?(?=\((?![\w\d]+\))[^\)]*\)|$)/) 
=> ["(größen xs-xxl)s+m+l+xl+xxl+xxxl", "(Solid-Farben)Dark Grey (2890)+Black (9000)+Mocca (5050)+Cognac (5048)", "(NEW DIMENSION)V-NECK+O-NECK+SIZE(tall)+SIZE(short)"] 

> str.scan(/(\([^()]*\))(.*?)(?=\((?![\w\d]+\))[^\)]*\)|$)/) 
=> [["(größen xs-xxl)", "s+m+l+xl+xxl+xxxl"], ["(Solid-Farben)", "Dark Grey (2890)+Black (9000)+Mocca (5050)+Cognac (5048)"], ["(NEW DIMENSION)", "V-NECK+O-NECK+SIZE(tall)+SIZE(short)"]] 
+0

是的,只有在這種情況下_scan_和_split_的結果之間的一線之差遺憾的是,這並不能提高正則表達式,也不是。事實上,可能會有超過兩個鍵值對。 – Mustermax 2015-03-03 13:35:20

+0

等待jsut一分鐘... – 2015-03-03 13:35:41

+0

您的正則匹配正確。https://regex101.com/r/dH4cL3/4我不知道什麼是錯的那麼,一個更復雜的輸入和預期的輸出會更好。 – 2015-03-03 13:37:04