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吗?
试试这个:
^([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})
您可以将Regex
和LINQ
组合起来,然后使用这样的扩展方法:
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)
- 至少匹配一个以两个大写字母开头,后跟4个十进制数字的字符串
- 可选地,在
##
之后从0到7次,并重复第一次匹配
结果:(*
表示匹配)
* AB1234
AB1234x
* AB1234##AB1234
* AB1234##AB1234##AB1234
AB1234##AB1234##AB1234x
观看现场演示。
注意:这个答案与其他答案非常相似。然而,这里的答案始于这样的假设,即至少存在AB1234
的一个序列。然后它允许的可能性,##AB1234
跟在它后面0到7次。最后,这两个正则表达式都很好。这归结为个人喜好。
还要注意,我使用了非捕获组(?:...)
来避免在这种情况下创建不需要的捕获组的不必要开销。(捕获组也称为反向引用。)