C#匹配正则表达式中的字母,数字和特殊字符

时间:2014-04-25 16:43:48

标签: c# regex string

我有以下Regex

[A-Z]{2}[0-9]{4}

它与这样的字符串完全匹配:AB1234。但我必须改进此Regex以符合这些特定规则:

  • 字符串在每个组之间必须只有两个锐利(##)(AB1234##AB1234
  • 它可能有8组字符串(AB1234##AB1234##AB1234##AB1234##AB1234##AB1234##AB1234##AB1234
  • 无论组数是多少,最后一组都不能拥有锐利(##)。所以,如果我有3个组,它将如下所示:AB1234##AB1234##AB1234

如果我使用第二个项目符号点中的示例字符串,我的Regex将与模式匹配,但在这种情况下,它不会对每个组之间的字符进行验证。

有人可以帮我改进这个正则表达式吗?

4 个答案:

答案 0 :(得分:2)

试试这个:

^([A-Z]{2}[0-9]{4}##){0,7}([A-Z]{2}[0-9]{4})$

答案 1 :(得分:1)

([A-Z]{2}[0-9]{4}##){0,7}([A-Z]{2}[0-9]{4})

答案 2 :(得分:1)

您可以合并RegexLINQ,然后使用这样的扩展方法:

public static bool Validate(this string source)
{
    string pattern = "[A-Z]{2}[0-9]{4}";
    return !source.StartsWith("##") &&
           !source.EndsWith("##") &&
           source.Split(new[] {"##"}, StringSplitOptions.RemoveEmptyEntries)
                 .All(x => Regex.IsMatch(x, pattern));
}

用法:

bool t1 = "AB1234##AB1234".Validate(); // true
bool t2 = "AB1234##AB1234##AB1234".Validate(); // true
bool t3 = "AB1234##AB1234##" // false

答案 3 :(得分:0)

^(?:[A-Z]{2}[0-9]{4})(?:##(?:[A-Z]{2}[0-9]{4})){0,7}$
    ^^^^^^^^^^^^^^^^    ^^^^^^^^^^^^^^^^^^^^^   ^^^
          (1)                    (2)            (3)
  1. 匹配至少一个以两个大写字母开头的字符串,后面跟着4位十进制数字。
  2. 可选择按照##从0到7次,并重复第一场比赛。
  3. 结果: *表示匹配)

    * AB1234
      AB1234x
    * AB1234##AB1234
    * AB1234##AB1234##AB1234
      AB1234##AB1234##AB1234x
    

    请参阅live demo

    注意:此答案与this other answer非常相似。但是,这里的答案首先假设存在至少一个AB1234序列。然后它允许可能性它被##AB1234跟随零到7次。最后,两个正则表达式都很好。这取决于个人偏好。

    另请注意,我使用了非捕获组(?:...)来避免创建在这种情况下不需要的捕获组的不必要开销。 (捕获组也称为反向引用。)