我有以下方法:
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();
}
}
字符串
对于像test-def.ghi@de.jkl.com
这样的电子邮件地址,这会失败(但对于像test@test.com
这样的电子邮件地址,* 不会 *)。
我知道regex是正确的模式,因为下面的LINQPad脚本显示了True
,正如预期的那样,对于完全相同的电子邮件地址:
void Main()
{
var r = new Regex(@"^\w+(\.\w+)*@\w+(\.\w+)+|(\w+(\s\w+)*)|[a-z0-9]+$");
r.IsMatch("test-def.ghi@de.jkl.com").Dump();
}
型
我尝试完全删除[Bind(nameof(query))]
,但没有帮助。
如果我把这个改成
public async Task<IActionResult> GetUsersAPICall([Bind(nameof(query))] string query)
{
if (!Regex.IsMatch(query, @"^\w+(\.\w+)*@\w+(\.\w+)+|(\w+(\s\w+)*)|[a-z0-9]+$"))
{
return BadRequest();
}
// ...
}
型
我完全不明白为什么我原来的东西不起作用。有人知道我错过了什么吗?
到目前为止,我在Stack Overflow上找到的最接近的是this Q&A,但结果是OP的regex是错误的(对我来说不是这样,因为Regex在两个不同的上下文中都能正常工作)。
1条答案
按热度按时间nfzehxib1#
问题出在正则表达式中,
IsMatch
和RegularExpression
注解在处理上存在差异。IsMatch
检查输入是否包含任何与提供的正则表达式匹配的内容。文件:指示指定的正则表达式是否使用指定的匹配选项和超时间隔在指定的输入字符串中找到匹配项。
所以它试图在你的输入中找到任何匹配,找到它(特别是第二次修改:
(\w+(\s\w+)*)
)并返回true。另一方面,
RegularExpression
注解检查您的整个输入是否与提供的正则表达式匹配。文件:正则表达式搜索精确匹配,而不是在模式的前面使用
^
,并且在模式的末尾使用$
会产生与使用它相同的结果。对于搜索命中,在模式前面加上.*
。因此,注解有效地应用了模式
^(?:^\w+(\.\w+)*@\w+(\.\w+)+|(\w+(\s\w+)*)|[a-z0-9]+$)$
。也许你试图达到类似的效果,但忘记了括号?