我有以下Regex
:
[A-Z]{2}[0-9]{4}
它与这样的字符串完全匹配:AB1234
。但我必须改进此Regex
以符合这些特定规则:
AB1234##AB1234
)AB1234##AB1234##AB1234##AB1234##AB1234##AB1234##AB1234##AB1234
)AB1234##AB1234##AB1234
如果我使用第二个项目符号点中的示例字符串,我的Regex
将与模式匹配,但在这种情况下,它不会对每个组之间的字符进行验证。
有人可以帮我改进这个正则表达式吗?
答案 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)
您可以合并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
答案 3 :(得分:0)
^(?:[A-Z]{2}[0-9]{4})(?:##(?:[A-Z]{2}[0-9]{4})){0,7}$
^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^ ^^^
(1) (2) (3)
##
从0到7次,并重复第一场比赛。 结果: (*
表示匹配)
* AB1234
AB1234x
* AB1234##AB1234
* AB1234##AB1234##AB1234
AB1234##AB1234##AB1234x
请参阅live demo。
注意:此答案与this other answer非常相似。但是,这里的答案首先假设存在至少一个AB1234
的序列。然后它允许可能性它被##AB1234
跟随零到7次。最后,两个正则表达式都很好。这取决于个人偏好。
另请注意,我使用了非捕获组(?:...)
来避免创建在这种情况下不需要的捕获组的不必要开销。 (捕获组也称为反向引用。)