示例: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行),然后它打破了。有什么方法可以解决这个问题吗?
答案 0 :(得分:2)
您可以添加常规替换,例如
|\s+\w+=\S+.
匹配空格后跟一个(一个或多个)单词字符([a-zA-Z0-9]
),然后是等号,最后是一些非空格字符。
答案 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_]
)
)