我是正则表达式的新手,但我似乎有事情进展。
https://regex101.com/r/Is8wZK/1 ---组 8 中可能有多个单词......由一个空格分隔,但是,如您所见,第 5 组也是如此,我已经用尽了 (.+) 的一次性使用量
如何重写正则表达式以完全按照检测组 5 的方式检测组 8?
^(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+
而不是原始空格,这样您就可以匹配其他分隔空格。
我将您的通用捕获组重做成这样:
^(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+$