正则表达式问题(在 asp.net MVC5 中)

Posted

技术标签:

【中文标题】正则表达式问题(在 asp.net MVC5 中)【英文标题】:Regular Expression problem (in asp.net MVC5) 【发布时间】:2019-07-01 17:35:54 【问题描述】:

希望有人可以用正则表达式指出我在这里缺少的东西。

这是我模型中的数据项:-

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

这应该允许我匹配以 ABC 或 WXYZ 开头并有另外 8 或 9 个字符/数字的序列。

在我看来,我正在使用 jquery 不显眼的验证和 @html.ValidationMessageFor 控件来显示错误。

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

ABCGC1000BC5

它通过了,但在我看来,我收到了一个验证错误,特别是字符串不符合正则表达式的要求。谁能看到我错过了什么?谢谢。

regex101.com screenshot

【问题讨论】:

使用分组,(ABC|WXYZ)\w8,9 @Wiktor Stribiżew 我不敢相信就是这样。非常感谢。请将此添加为解决方案,以便我接受。并感谢您闪电般的快速回复。 发布在下面。作为最佳实践,我建议使用非捕获版本。 【参考方案1】:

您的正则表达式匹配两种类型的字符串:1) ABC 或 2) WXYZ 后跟 8 或 9 个字符。请记住,RegularExpressionAttribute 模式必须匹配整个字符串。即使 regex101.com 显示匹配 ABC12,它也不会在您的环境中匹配。

你需要使用分组,

(ABC|WXYZ)\w8,9
^        ^

一个非捕获组会更合适,因为您只是验证一个字符串而不是稍后使用捕获:

(?:ABC|WXYZ)\w8,9
^^^        ^

【讨论】:

【参考方案2】:

RegularExpressionAttribute 搜索完全匹配:如果正则表达式没有锚定到字符串的开头或结尾,那么RegularExpressionAttribute 将有效地为您进行锚定。 See the implementation on ReferenceSource.

这就是 regex101.com 和失败的测试之间的区别。如果您将正则表达式锚定在 regex101.com 上,如 ^ABC|WXYZ\w8,9$,您将看到它失败了。

正如 Wiktor Stribiżew 在 cmets 中指出的那样,原因是您的正则表达式查找 ABCWXYZ\w8,9^ABC$^WXYZ\w8,9$ 都不匹配您的测试字符串 ABCGC1000BC5

编辑:(请接受 Wiktor Stribiżew 的回答作为解决方案。这个回答只是为了解释在 regex101.com 和 ASP.NET 上运行它的区别)。

【讨论】:

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

以上是关于正则表达式问题(在 asp.net MVC5 中)的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC5 实现 SQL 查询工具

在 ASP.NET MVC5 中使用 Steam 登录

为啥我的正则表达式在 ASP.NET 中不起作用

如何在 OWIN ASP.NET MVC5 中注销用户

如何在 Asp.Net MVC 中将正则表达式分解为多个正则表达式?

贪婪量词的 ASP.Net 正则表达式问题