您可以使用正则表达式,捕获所有“固定”组并使用任何剩余的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'保留所有内容...... –