我是正则表达式的新手,但我似乎已经顺其自然。
https://regex101.com/r/Is8wZK/1 ---第8组可能在其中有多个单词...由空格隔离,但是,正如您所见,第5组也是如此,我和#39;已经耗尽了我一次性使用的(。+)
如何重新编写我的正则表达式来检测第8组,就像检测到第5组一样?
答案 0 :(得分:2)
^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+((?:[[:alpha:]]+)(?:\s+[[:alpha:]]+)*)\s+(\S+)\s+(\S+)\s+((?:[[:alpha:]]+)(?:\s+[[:alpha:]]+)*)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)$
链接:https://regex101.com/r/v4mEJK/1
您需要做的就是匹配一组字母字符和一组可选空格加上字母字符,以便捕获可能包含或不包含多个单词的名称;这是通过使用
完成的(?:[[:alpha:]]+)(?:\s+[[:alpha:]]+)*)
第5组和第8组。
正则表达式的其余部分可能更具体,但除非您的输入文本比测试用例复杂得多,否则实际上不需要添加更多复杂性。
FWIW:
最好使用\s+
而不是组之间的原始空间,这样就可以匹配其他分隔空格。
答案 1 :(得分:1)
我将您的通用捕获组重新编写为:
^(\d+\/\d+\/\d+) ([A-Z]\d+) (\d+) (\d+) (.+) (\d+[A-Z]{3}\d+) (\d+) (.+) ([A-Z]) (\d+\.\d+) (\d+\.\d+) (\d+\.\d+)$
打破这一点:
(\d+\/\d+\/\d+)
:这与日期匹配([A-Z]\d+)
:这匹配一个大写后跟一些数字(\d+)
:这匹配一个数字(\d+)
:这匹配一个数字(.+)
:这是第一个通用群组 (\d+[A-Z]{3}\d+)
:这匹配任意数字,后跟3个大写字母,后跟任意数字(\d+)
:这匹配一个数字(.+)
:这是第二个通用组 (\d+\.\d+)
:这匹配带小数点的数字(\d+\.\d+)
:这匹配带小数点的数字(\d+\.\d+)
:这匹配带小数点的数字这可以帮助你得到你想要的东西。
如果您仅对第5组和第8组感兴趣,请尝试非捕获组:
^(?:\d+\/\d+\/\d+) (?:[A-Z]\d+) (?:\d+) (?:\d+) (.+) (?:\d+[A-Z]{3}\d+) (?:\d+) (.+) (?:[A-Z]) (?:\d+\.\d+) (?:\d+\.\d+) (?:\d+\.\d+)$
或仅将您需要的内容分组:
^\d+\/\d+\/\d+ [A-Z]\d+ \d+ \d+ (.+) \d+[A-Z]{3}\d+ \d+ (.+) [A-Z] \d+\.\d+ \d+\.\d+ \d+\.\d+$