我正在尝试(不成功)使用RegEx提取一些信息,但我无法理解为什么某个元素没有在正确的组中捕获。
这是表达式
^[\\* ](?'sname'[A-Z]+)/(?'fname'[A-Z]+) (\\*(?'chdinf'(INF|CHD)))? (?'random'.+?) (?'cpn'CPN[\\* ][1234])(?'status'.+?) (?'tktno'[0-9]+)$
这是一个示例输入
*SNAME/FNAME *INF CPN 2 XX XXXX 99999999999999
我应该在*INF
群组中捕获chdinf
文字,但不是random
群体正在捕捉{/ 1}}。
*INF
文本是可选信息,因此分组结构末尾的lazy ?
。
如果我将random
构造更改为(?'random' +?)
(空格,而不是'。'),那么正则表达式完全失败。
PS:我一直在使用http://regexstorm.net/tester作为测试平台。
答案 0 :(得分:3)
您没有考虑前面的空白区域。试试这个:
^[\* ](?'sname'[A-Z]+)\/(?'fname'[A-Z]+) +(\*(?'chdinf'(INF|CHD)))? (?'random'.+?) (?'cpn'CPN[\* ][1234])(?'status'.+?) (?'tktno'[0-9]+)$
请参阅' +'我之前加了。这是你需要的吗?
答案 1 :(得分:2)
我根据自己的要求重建正则表达式:
^[* ](?'sname'[A-Z]+)/(?'fname'[A-Z]+)\s+(\*(?'chdinf'INF|CHD))?\s+(?'random'\S+)?\s+(?'cpn'CPN[* ][1-4])\s+(?'status'.+?)\s+(?'tktno'[0-9]+)$
最值得注意的是,您在各个部分之间错过了可变数量的空白。我使用了\s+
代替。
Regex Matches...
^ the beginning of the input string
[* ] a space or a "*"
(?'sname'[A-Z]+) an upper case identifier
/ a "/" separator
(?'fname'[A-Z]+) another upper case identifier
\s+ at least one whitespace character
(\*(?'chdinf'INF|CHD))? a "*" followed by "INF" or "CHD" (optionally)
\s+
(?'random'\S+)? at least one of all non-whitespace characters (optionally)
\s+
(?'cpn'CPN[* ][1-4]) "CPN" followed by a space or a "*" followed by a number
between 1 and 4
\s+
(?'status'.+?) anything (lazily)
\s+
(?'tktno'[0-9]+) an interger number greater or equal 0
$ the end of the input string.
以下输入......
*SNAME/FNAME *INF CPN 2 XX XXXX 99999999999999
SNAME/FNAME *INF CPN 2 XX XXXX 99999999999999
*SNAME/FNAME *INF CPN*2 XX XXXX 99999999999999
*SNAME/FNAME CPN 2 XX XXXX 99999999999999
*SNAME/FNAME RAND CPN 2 XX XXXX 99999999999999
...我通过RegEx Storm Tester获得了这些匹配。
(我从正则表达式中删除了前导^
以及尾随$
并激活了 Multiline 选项,以便一次测试所有输入字符串。)