正则表达式情况..具有可变空格的多个组



我是正则表达式的新手,但我似乎有事情进展。

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+$

相关内容

最新更新