我有一个需要捕获以下字符串的正则表达式:
xxx 2018 12833833 19322222 KEY 83 a 84 a 1
2018 12833833 19322222 KEY Q 83 a 84 a 1
2018 12833833 19322222 KEY 0.5
—工作良好
2018 12833833 19322222 KEY C 9 83 a 84 a 1
—工作良好
我的正则表达式几乎得到他们所有,但有几个是失败的,我正在努力与内部部分(Q
在中间一个)
(?P<YEAR>d{4})s(?P<EMPTY>[.S]*)s(?P<KAT>[A-Zd]*)s(?P<POP>[A-Zs]*)s(?P<REST>.*?)(?P<XXX>s(?P<X1>d*)s(?:.{1})s(?P<X2>d*)s(?:.{1})s)?(?P<UNT>[0-9.]*$)
以下是我捕获的错误:#1和#2 - REST捕获POP之后的所有内容,但最后1 (REST不应该捕获任何内容)
我试图强制REST作为?
的可选,但它的捕获无论如何
看来你可以试试:
(?P<YEAR>d{4})s(?P<EMPTY>d{8})s(?P<KAT>d{8})s(?P<POP>[A-Z]+(?:s[A-Z]+)?)(?:s(?P<REST>d+))?(?:s(?P<XXX>(?P<X1>d+)s.s(?P<X2>d+)s.))?s(?P<UNT>d+(?:.d+)?)$
看这里的在线演示
(?P<YEAR>d{4})
- 4位命名捕获组。s
-中间空格字符。(?P<EMPTY>d{8})
- 8位命名捕获组s
-中间空格字符。(?P<KAT>d{8})
- 8位命名捕获组s
-中间空格字符。(?P<POP>[A-Z]+(?:s[A-Z]+)?)
-可选的命名捕获组,至少有1+大写字母和一个可选的包含更多大写字符的空格。(?:s(?P<REST>d+))?
-可选非捕获组,包含1+数字的命名捕获组。(?:s(?P<XXX>(?P<X1>d+)s.s(?P<X2>d+)s.))?
-另一个可选的非捕获组,包含两个嵌套的命名捕获组。s
-中间空格字符。(?P<UNT>d+(?:.d+)?)
-命名捕获组捕获1+数字,可选的小数点后面跟着更多数字。$
-结束字符串锚。