以任意顺序匹配多个组,其间包含未知文本

时间:2017-11-08 09:31:55

标签: regex regex-lookarounds regex-group

示例:HERE

我有一些文字如下:

M=NS MAX=[5,10,20,20] A=4 MIN=[1,1,1,20] R=1 S=1 T=3 D=2 

M=NS MAX=[5,10,20,20] MIN=[1,1,1,20] R=1 S=1 T=3 A=4 D=2 

M=NS MAX=[5,10,20,20] Z=123 MIN=[1,1,1,20] R=1 S=1 T=3 A=4 D=2 

我有我的正则表达式:

^(?:\w*M=(?P<M>\w+)
|\s+S=(?P<S>[\d,]+)
|\s+C=(?P<C>[\d,]+)
|\s+MAX=\[(?P<MAX>[\d,]+)\]
|\s+MIN=\[(?P<MIN>[\d,]+)\]
|\s+A=(?P<A>\d+)
|\sR=(?P<R>[\d,]+))+.*?$

正则表达式工作得很好,但是,我仍然坚持这个问题的最后部分。正则表达式适用于我正在寻找的任何术语的顺序,但只要中间有一个附加术语,就不会将其作为一个组进行检查(例如Z=123在第3行),然后它打破了。有什么方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

您可以添加常规替换,例如

|\s+\w+=\S+.

匹配空格后跟一个(一个或多个)单词字符([a-zA-Z0-9]),然后是等号,最后是一些非空格字符。

See your modified example here

答案 1 :(得分:1)

我可能在这里胜过,但是你不能使用所有键/值对的通用表达式?目前,您的所有示例都可以通过

进行匹配
(?P<key>\b[A-Z]+\b) # key group
\h*=\h*             # spaces, = spaces
(?P<value>          # value group
    (\[)?           # if the first char is a [
        (?(3).*?\]  # ... look for ]
        |           # else
        \w+         # [a-zA-Z0-9_]
    )
)

请参阅a demo on regex101.com