模式的C#Regex语法

时间:2017-08-10 16:32:45

标签: c# regex

在继续之前,我需要确保字段在C#中使用Regex具有正确的语法。这是我的代码:

Description = 'AB1234567,AB3456789;AB2345678';

Regex reg = new Regex("(AB.{7},?)*;?(AB.{7},?)*");
Match match = reg.Match(Description);
if (!match.Success)
{
    //code to raise error
}

所以,一些语法规则:

  • 该字段包含2个字母的元素(在本例中为AB),后跟7个字符。
  • 这些元素以逗号分隔,位于“;”的左侧或右侧。他们在哪一方面表示他们的属性,但任何一方都可以是空的。
  • 如果右侧不为空,则“;”是强制性的,如果是空的,则是可选的。
  • 每一方的最后一个元素不能以“,”结尾。

正确的例子:

 - AB1234567,AB3456789;AB2345678
 - AB1234567,AB3456789;
 - AB1234567
 - ;AB2345678,AB34567890

错误的例子:

 - AB1234567,;AB2345678
 - AB3456789;AB2345678,

我的正则表达式并不完整,但我无法想出如何考虑所有情况。这个问题的正确表达式是什么?

1 个答案:

答案 0 :(得分:-1)

我认为你的表达几乎是正确的,你只需要确保另一个AB组后面跟着一个逗号。您可以使用positive lookahead执行此操作,如下所示:

^(AB.{7}(,(?=AB))?)*;?(AB.{7}(,(?=AB))?)*$

您还需要输入开始和结束标记,否则您将获得多个子匹配。

此表达式与;AB2345678,AB34567890样本不匹配,因为它在最后一组中有8位而不是7位

编辑:如果你想要一个漂亮的集合中的AB组,请尝试

^((?<left>AB.{7})(,(?=AB))?)*;?((?<right>AB.{7})(,(?=AB))?)*$

然后match.Groups["left"]?.Capturesmatch.Groups["right"]?.Captures将为您提供相应的匹配字符串(或null)。这称为命名捕获。