我有一個字符串正則表達式的鍛鍊,解析意外搞砸串
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)
這打破每一種方式,因爲我現在需要三個捕獲。當然,我的原始正則表達式只能匹配兩個事件,但如果我不知道有多少部分「粘在一起」呢?
難道某人腦子比我大,請賜教嗎?我希望看到這樣做更加優雅,並且作爲附加功能,可以在將「粘合在一起」之前擴展到原始零件的無限次出現(甚至只有一次)。 (:
是的,只有在這種情況下_scan_和_split_的結果之間的一線之差遺憾的是,這並不能提高正則表達式,也不是。事實上,可能會有超過兩個鍵值對。 – Mustermax 2015-03-03 13:35:20
等待jsut一分鐘... – 2015-03-03 13:35:41
您的正則匹配正確。https://regex101.com/r/dH4cL3/4我不知道什麼是錯的那麼,一個更復雜的輸入和預期的輸出會更好。 – 2015-03-03 13:37:04