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

本文关键字:数字 特殊字符 正则表达式 | 更新日期: 2023-09-27 18:00:04

我有以下Regex:

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

并且它与这样的字符串完全匹配:CCD_ 2。但我必须改进这个Regex,以符合以下特定规则:

  • 字符串在每组(AB1234##AB1234)之间必须只有两个锐化(##)
  • 它可以有8组字符串(AB1234##AB1234##AB1234##AB1234##AB1234##AB1234##AB1234##AB1234
  • 无论组的数量如何,最后一个组的末尾都不能有锐器(##)。所以,如果我有3个组,它看起来是这样的:AB1234##AB1234##AB1234

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

有人能帮我改进这个Regex吗?

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

试试这个:

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

您可以将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
^(?:[A-Z]{2}[0-9]{4})(?:##(?:[A-Z]{2}[0-9]{4})){0,7}$
    ^^^^^^^^^^^^^^^^    ^^^^^^^^^^^^^^^^^^^^^   ^^^
          (1)                    (2)            (3)
  1. 至少匹配一个以两个大写字母开头,后跟4个十进制数字的字符串
  2. 可选地,在##之后从0到7次,并重复第一次匹配

结果:*表示匹配)

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

观看现场演示。

注意:这个答案与其他答案非常相似。然而,这里的答案始于这样的假设,即至少存在AB1234的一个序列。然后它允许的可能性##AB1234跟在它后面0到7次。最后,这两个正则表达式都很好。这归结为个人喜好。

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