以任意顺序匹配多个组,中间有未知文本

Match multiple groups in any order with unknown text in between

示例: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,]+))+.*?$

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

您可以添加通用替换,例如

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

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

See your modified example here.

我可能在这里被打败了,但是你不能对 所有 key/value 对 使用通用表达式吗?目前,您的所有示例都可以匹配

(?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