ASP.NET MVC5 中的正则表达式问题

3

希望有人能指出我在正则表达式中遗漏了什么。

这是来自我的模型的数据项:

[Display(Name = "Serial to Search")]
[MaxLength(12)]
[RegularExpression(@"ABC|WXYZ\w{8,9}")]
public string SerialNo { get; set; }

我希望能够匹配以ABC或WXYZ开头,并且有另外8或9个字符/数字的串。

在我的看法中,我使用了jQuery非侵入式验证和@Html.ValidationMessageFor控件来显示错误。

我已经在regex101.com上使用以下测试字符串进行了测试:

ABCGC1000BC5

我运行程序时没有出现问题,但是在我的视图中,我收到了一个验证错误,具体来说是字符串不符合正则表达式的要求。有人能看出我漏掉了什么吗?谢谢。

regex101.com 截图


3
请使用分组 (ABC|WXYZ)\w{8,9}。该表达式用于匹配以ABC或WXYZ开头,后接8-9个字母或数字的字符串。 - Wiktor Stribiżew
@Wiktor Stribiżew 我简直不敢相信就是这个问题。非常感谢。请将此作为解决方案添加,以便我可以接受它。还要感谢您的快速回复。 - Dugggie
如下所示。建议使用非捕获版本,作为最佳实践。 - Wiktor Stribiżew
2个回答

4
你的正则表达式匹配两种类型的字符串:1)ABC 或 2)以 WXYZ 开头,后跟8或9个字母字符。请记住,RegularExpressionAttribute 模式必须匹配整个字符串。即使 regex101.com 显示 ABC12 匹配,它也不会在你的环境中匹配。
你需要使用分组。
(ABC|WXYZ)\w{8,9}
^        ^

一个非捕获组可能会更适合,因为你只是验证一个字符串而不是稍后使用捕获结果。
(?:ABC|WXYZ)\w{8,9}
^^^        ^

1

RegularExpressionAttribute搜索完全匹配的内容:如果正则表达式没有锚定在字符串的开头或结尾,那么RegularExpressionAttribute将为您实现这种锚定。请参见ReferenceSource上的实现

这就是regex101.com和您的测试失败的区别。如果您在regex101.com上锚定正则表达式,如^ABC|WXYZ\w{8,9}$,您会发现它失败了。

原因是,正如Wiktor Stribiżew在评论中指出的那样,您的正则表达式寻找ABCWXYZ\w{8,9}^ABC$^WXYZ\w{8,9}$都不与您的测试字符串ABCGC1000BC5匹配。

编辑:(请接受Wiktor Stribiżew的答案作为解决方案。此答案旨在解释在regex101.com和ASP.NET上运行之间的差异)。


感谢 @canton7 的解释,非常有用。 - Dugggie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接