正则表达式问题(在 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 中指出的那样,原因是您的正则表达式查找 ABC
或 WXYZ\w8,9
。 ^ABC$
和 ^WXYZ\w8,9$
都不匹配您的测试字符串 ABCGC1000BC5
。
编辑:(请接受 Wiktor Stribiżew 的回答作为解决方案。这个回答只是为了解释在 regex101.com 和 ASP.NET 上运行它的区别)。
【讨论】:
感谢@canton7 的解释,非常有用。以上是关于正则表达式问题(在 asp.net MVC5 中)的主要内容,如果未能解决你的问题,请参考以下文章