正则表达式适用于在线正则表达式测试程序但不适用于.NET

时间:2015-04-23 06:59:24

标签: c# .net regex

以下demo在线工作得很好,但在我尝试在c#/ .NET中运行时却没有#

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

这里有一个link帖子,可以解释正则表达式和我想要做的事情

1 个答案:

答案 0 :(得分:5)

RegularExpressionAttribute要求字符串完全匹配。

在你的情况下,你只是从@字符开始匹配,所以你从你的字符串之间的某个地方开始。这对于RegularExpressionAttribute来说还不够好。您可以认为它在表达式的开头添加了一个隐式^(最后也是一个隐式的$,所以您也可以删除它。)

所以要解决这个问题,你需要确保它在开始时有匹配的内容,例如: .*?

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

然后它有效。您不需要任何其他正则表达式标志。

不幸的是,文档中没有提到RegularExpressionAttribute的这种行为。您可以在reference source中验证它:

// 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);

所以从技术上讲,它不是添加的^$,但在找到匹配后,需要使用开始和结束索引来匹配字符串的开始和结束索引(这基本上是相同的事情)。

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