希望有人可以用正则表达式指出我在这里所缺少的。
这是我模型中的数据项:-
[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
并通过,但是在我看来,我收到验证错误,特别是该字符串不符合正则表达式要求。谁能看到我所缺少的吗?谢谢。
答案 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在评论中指出的,原因是您的正则表达式查找ABC
或WXYZ\w{8,9}
。 ^ABC$
和^WXYZ\w{8,9}$
都不与您的测试字符串ABCGC1000BC5
匹配。
编辑:(请接受Wiktor Stribiew的答案作为解决方案。此答案仅用于解释在regex101.com和ASP.NET中运行它的区别。)