ASP.NET Core中[RegularExpression]验证失效问题求助
问题根源与解决方案
问题出在正则表达式的分组逻辑以及[RegularExpression]特性和直接调用Regex.IsMatch的行为差异上:
1. 正则的优先级问题
你写的正则^\w+(\.\w+)*@\w+(\.\w+)+|(\w+(\s\w+)*)|[a-z0-9]+$没有给三个分支加最外层括号,导致正则的优先级规则让^只绑定第一个分支,$只绑定最后一个分支。实际逻辑变成了:
- 要么以邮箱格式开头(但后面可以随意追加内容)
- 要么匹配任意空格分隔的单词(无首尾限制)
- 要么以字母数字结尾(前面可以随意追加内容)
2. 两种验证方式的核心差异
- 直接调用
Regex.IsMatch:只要字符串中有任意部分匹配正则分支,就会返回true。比如test-def.ghi@de.jkl.com里的test、def等片段会匹配第三个分支[a-z0-9]+,所以验证通过。 [RegularExpression]特性:要求整个输入字符串完全匹配正则。而你的原正则没有办法让test-def.ghi@de.jkl.com完整匹配任何一个分支(第一个分支的\w不支持连字符,且没有首尾包裹),所以验证失败。
3. 额外的邮箱格式问题
你的邮箱分支里的\w不包含连字符,但邮箱用户名部分是允许使用连字符的,这也是test-def.ghi@de.jkl.com无法匹配第一个分支的原因之一。
修正后的代码
把正则用最外层括号包裹,同时修改邮箱分支的匹配规则支持连字符:
public async Task<IActionResult> GetUsersAPICall([Bind(nameof(query))] [RegularExpression(@"^([\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+|(\w+(\s\w+)*)|[a-z0-9]+)$", ErrorMessage = "This does not look like a valid query")] string query) { if (!ModelState.IsValid) { return BadRequest(); } // ...后续业务逻辑 }
这样修改后,[RegularExpression]特性会要求整个字符串完全匹配三个分支中的某一个,既符合你的验证需求,也能正确匹配带连字符的邮箱地址。
内容的提问来源于stack exchange,提问作者EJoshuaS
相关产品推荐
相关产品推荐

