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

时间:2019-02-07 14:55:12

标签: c# regex asp.net-mvc

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

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

[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 screenshot

2 个答案:

答案 0 :(得分:3)

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

您需要使用分组,

(ABC|WXYZ)\w{8,9}
^        ^

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

(?:ABC|WXYZ)\w{8,9}
^^^        ^

答案 1 :(得分:1)

RegularExpressionAttribute搜索精确匹配:如果正则表达式未锚定在字符串的开头或结尾,则RegularExpressionAttribute将为您有效地进行锚定。 See the implementation on ReferenceSource

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

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

编辑:(请接受Wiktor Stribiew的答案作为解决方案。此答案仅用于解释在regex101.com和ASP.NET中运行它的区别。)