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

时间:2018-05-17 22:35:08

标签: c# regex

我是正则表达式的新手,但我似乎已经顺其自然。

https://regex101.com/r/Is8wZK/1 ---第8组可能在其中有多个单词...由空格隔离,但是,正如您所见,第5组也是如此,我和#39;已经耗尽了我一次性使用的(。+)

如何重新编写我的正则表达式来检测第8组,就像检测到第5组一样?

2 个答案:

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