regex可以在联机regex测试程序中使用,但不能在.NET中使用



下面的演示在网上运行得很好,但当我尝试在c#/.NET中运行它时就不行了

var regex = new RegularExpressionAttribute(@"@(?!.*?..)[^@]+$");
Assert.IsTrue(regex.IsValid("bob@bob.com"));

这里有一个链接,将解释正则表达式和我正在尝试做什么

RegularExpressionAttribute需要字符串的完全匹配。

在您的情况下,您只从@字符开始匹配,所以您从字符串之间的某个位置开始匹配。这对于RegularExpressionAttribute来说还不够好。你可以考虑在表达式的开头添加一个隐式^(在结尾也添加一个隐含的$,所以你也可以去掉它)。

因此,要解决此问题,您需要确保它在开始时有匹配的内容,例如.*?:

new RegularExpressionAttribute(@".*?@(?!.*?..)[^@]+");

然后它就起作用了。您不需要任何其他正则表达式标志。


不幸的是,RegularExpressionAttribute的这种行为在文档中没有提及。但是,您可以在参考来源中进行验证:

// We are looking for an exact match, not just a search hit. This matches what
// the RegularExpressionValidator control does
return (m.Success && m.Index == 0 && m.Length == stringValue.Length);

因此,从技术上讲,它不是添加的^$,而是在找到匹配项后,需要开始索引和结束索引来匹配字符串的开始索引和结尾索引(本质上是一样的)。

如果你仔细想想,这种行为对验证很有意义。毕竟,您希望确保字符串与特定的完全指定格式匹配,而不仅仅是检查某个子字符串是否有效。

相关内容

  • 没有找到相关文章

最新更新