Regex捕获组除以介于两者之间的数字



我需要从一个字符串中捕获3个组。字符串的形式如下:

{phrase 1} {optional number} {optional phrase 2}

例如:

Battery Bank 1
Battery Bank 1 Segments
Battery Bank 1 Warranty Logger
Battery Bank 10
Battery Bank 10 Segments
Battery Bank 10 Warranty Logger
BSU
BSU 1
PCS 3
PCS 1
System
System Meter

正如你所看到的,唯一的强制组是第一个,它由单词字符和空格组成,直到出现至少1位的数字。然后,可以选择另一组单词和空格字符。

这就是我目前所拥有的,但它不能正常工作。它在线路上匹配。每行应该匹配一个。

([a-zA-Zs]+)(d+)?(w)?

这里有一个regex101链接可供使用:https://regex101.com/r/tSGIEm/2

您可以将此正则表达式与可选组一起使用:

([a-zA-Z]+(?:[ t]+[a-zA-Z]+)*)(?:[ t]+(d+)(?:[  t]+(.+))?)?

更新RegEx演示

RegEx详细信息:

  • (:启动捕获组#1
    • [a-zA-Z]+:匹配一个超过1个字母的单词
    • (?:[ t]+[a-zA-Z]+)*:匹配由1+空格/制表符分隔的0个或多个单词
  • ):结束捕获组#1
  • (?::启动非捕获组#1
    • [ t]+:匹配1+个空格或制表符
    • (d+):匹配1+个数字并在第2组捕获
    • (?::启动非捕获组#2
      • [ t]+:匹配1+个空格或制表符
      • (.+):匹配任意字符的1+并捕获第3组
    • )?:结束可选非捕获组#2
  • )?:结束可选非捕获组#1

您可以使用

^(.*?)(?: +(d+) *(.*))?$

请参阅regex演示。

详细信息

  • ^-字符串的开头
  • (.*?)-第1组:除换行符之外的任何零个或多个字符,尽可能少
  • (?: +(d+) *(.*))?-一个可选的组,匹配1或0次:
    • +-1+空间
    • (d+)-组2:一个或多个数字
    • *-0+个空格
    • (.*)-第3组:除换行字符外的任何零个或多个字符,尽可能多
  • $—字符串结束

最新更新