RegEx没有捕获

时间:2016-06-09 07:05:09

标签: c# regex

我正在尝试(不成功)使用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作为测试平台。

2 个答案:

答案 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获得了这些匹配。

String parts captured by the above regular expression

(我从正则表达式中删除了前导^以及尾随$并激活了 Multiline 选项,以便一次测试所有输入字符串。)