我需要从一个字符串中捕获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组:除换行字符外的任何零个或多个字符,尽可能多
$
—字符串结束