Regex.Match与DataAnnotations中RegularExpression行为差异原因排查
问题描述
我有一个简单的输入字符串,用Regex.Match验证能通过,但用DataAnnotations的RegularExpression特性验证却失败,两者使用的正则模式完全一致,请问原因是什么?
Regex.Match验证通过的代码示例
const pattern = @"^myinput\.xyz\.abc\.*"; const input = "myinput.xyz.abc.blablabla-blablabla"; const isValid = Regex.Match(request.TransactionId, pattern).Success; // 返回true,验证通过
DataAnnotations验证失败的代码示例
public class DummyObject { [Required] [MaxLength(100)] [RegularExpression(@"^myinput\.xyz\.abc\.*")] // 始终验证失败,模式与上述完全一致 public string DummyString { get; set; } }
原因分析
Regex.Match的逻辑是只要字符串中存在匹配正则的子串就返回成功,而DataAnnotations的RegularExpression特性默认要求正则匹配整个字符串——它相当于自动给正则加上了首尾锚定的强制要求(隐含^和$的约束)。
你的正则^myinput\.xyz\.abc\.*仅能匹配以myinput.xyz.abc开头、后续跟着任意数量(包括0个)英文点的片段,但输入字符串后面还有blablabla-blablabla这类内容,所以:
Regex.Match找到开头的匹配片段就判定验证通过RegularExpression要求整个字符串都符合正则规则,因此验证失败
解决方案
调整正则,让它能覆盖整个输入字符串的内容,比如:
[RegularExpression(@"^myinput\.xyz\.abc.*")]
将原正则中的\.*改为.*,.*可以匹配任意字符(除换行符)的任意数量,刚好覆盖输入后续的所有内容。
如果需要限制后续字符的类型,也可以针对性修改,比如只允许字母、数字和连字符:
[RegularExpression(@"^myinput\.xyz\.abc[0-9a-zA-Z-]*$")]
内容的提问来源于stack exchange,提问作者Hoang Minh
相关产品推荐
相关产品推荐

