【问题标题】:regex works in online regex tester but not in .NET正则表达式适用于在线正则表达式测试器,但不适用于 .NET
【发布时间】:2015-04-23 06:59:24
【问题描述】:

以下demo 可以在网上正常工作,但当我尝试在 c#/.NET 中运行它时却不行

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

这是一个 link 发布,它将解释正则表达式以及我正在尝试做的事情

【问题讨论】:

  • 你想达到什么目的?验证电子邮件?

标签: c# .net regex


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢....是的,这确实有效..不知道为什么它被否决了..这是解决方案
  • 还不如去掉尾随的$
  • 能否请您提供来自msdn.microsoft.com/en-us/library/… 的报价,其中指出需要完整匹配?
  • @stribizhev 不幸的是,我不能,因为根本没有我可以引用的东西。但是,我根据参考源添加了一些证明(以防实际证明还不够)。
猜你喜欢
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-24
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多