您可以使用正則表達式,捕獲所有「固定」組並使用任何剩餘的info
。如果info
部分包含,
或=
字符,則這應該甚至可以工作。這裏有一個簡單的例子(使用Python,但這不應該是一個問題...)。
>>> p = r"(type=[A-Z]+), (languageCode=[-A-Z]+), (url=[^,]+), (ref=\d), (info=.+?), (deactivated=(?:true|false))"
>>> s = "type=INFO, languageCode=EN-GB, url=http://www.stackoverflow.com, ref=1, info=Text, that may contain all kind of chars, even deactivated=true., deactivated=false"
>>> re.search(p, s).groups()
('type=INFO',
'languageCode=EN-GB',
'url=http://www.stackoverflow.com',
'ref=1',
'info=Text, that may contain all kind of chars, even deactivated=true.',
'deactivated=false')
是否有這些元素都是可選的,你可以把一個?
這些團體後,使逗號可選。如果訂單可能不同,那麼它更復雜。在這種情況下,不要使用一個RegEx一次捕獲所有內容,而要使用多個RegEx捕獲各個屬性,然後在匹配下一個屬性之前刪除(替換爲''
)字符串中的那些屬性。最後,匹配info
。
在進一步考慮,因爲這些屬性可以有任何命令,它可能是更有希望捕捉到剛剛一切從一個關鍵字跨越到下一個,而不管其實際內容的,非常類似於Pshemo的解決方案:
keys = "type|languageCode|url|ref|info|deactivated"
p = r"({0})=(.+?)(?=\, (?:{0})=|$)".format(keys)
matches = re.findall(p, s)
但是,這也可能會在一些非常模糊的情況下失敗,例如如果info
屬性包含類似', ref=foo'
的內容,包括逗號。但是,似乎沒有辦法解決這些模糊問題。如果你有像info=in this string, ref=1, and in another, ref=2, ref=1
這樣的字符串,它是否包含一個ref
屬性,或者三個,或者根本沒有?
是這個要素的順序固定的嗎? – Pshemo
如何搜索'=',然後選擇前面的單個字作爲字段名稱。在'='之後的所有內容,直到下一個字段名稱是值。這個假設值不能包含'=' - 如果可以的話,你沒有太多可選的東西。 – xxbbcc
如果所有的_other_屬性都有一個可預測的格式,那麼可以刪除這些屬性,併爲'info'保留所有內容...... –