正则表达式有条件不在最小下划线上返回false

时间:2017-05-14 01:49:41

标签: c# regex string alphanumeric

如果RegEx匹配,我正在使用此RegEx

 if (Regex.IsMatch(_familyname, @"(\S*_){3}\S"))

我试图确保通过测试的单词至少有这个 Word1_Word2_WORD3-maybe_Word4(注意字内的连字符或空格并不重要) RegEx (\S*_){3}\S允许带有两个下划线的单词也通过。 是否只有三个下划线的RegEx匹配,并且这些下划线之间允许任何单词/字符/符号?哦它也永远不会结束或以下划线开头。此外,如果测试第三个字母数字字符串是所有大写字母将是伟大的。实际上我用字符串拆分实现了这一切。不过我读RegEx可以更快吗?还使用.NET 4.5.2

3 个答案:

答案 0 :(得分:0)

你的表达是“贪婪的”试试这个:

if(Regex.IsMatch( familyname,@“(\ S *?){3} \ S”))

有关更多信息,请参阅: http://www.regular-expressions.info/possessive.html

答案 1 :(得分:0)

我必须添加另一个正则表达式条件以防止用户创建带有4个下划线的名称,这可以防止最常见的错误,它们可能会添加更多,因此它不是最优雅的解决方案,除了它可能比使用一个的解决方案运行得慢正则表达式声明。 Thanx Mageos为贪婪,懒惰和占有欲的教程,我使用+来获得使用正则表达式风暴的较少匹配,所以我猜这是一种比以前更快的方法。

Regex.IsMatch( familyname,@“(\ S + ){3} \ S”)
&安培;! Regex.IsMatch( familyname,@“(\ S + ){4} \ S”)

答案 2 :(得分:0)

似乎您要验证一个字符串,其中包含一组非空白字符,其中包含正好有3个下划线。这里的主要问题是\S也匹配下划线,这就是为什么你真的需要[^\s_]构造 - 一个否定的字符类匹配任何字符,但是空格和_

接下来,您要确保匹配的起点前面没有非空格(它还包含_),因此,您需要一个负面的后置(?<!\S)

最后,因为你需要确保除了空格和下划线之外的第4个字符块之后没有_,你需要使用原子组(因为有.NET正则表达式中没有占有量词,以防止回溯到[^\s_]+模式(即只检查最后一个char与_匹配后是否有[^\s_])。

使用

var res = Regex.IsMatch(str, @"(?<!\S)[^\s_]+(?>_[^\s_]+){3}(?!_)");

请参阅regex demo

<强>详情:

  • (?<!\S) - 一个负面的后视图,确保当前位置左侧没有非空格字符
  • [^\s_]+ - 除了空白和_
  • 之外的1个字符
  • (?> - 原子团的开始
    • _ - 下划线
    • [^\s_]+ - 除了空白和_
    • 之外的1个字符
  • ){3} - 重复匹配原子组的内容3次
  • (?!_) - 如果右侧有_,请检查一次,如果有,请将比赛失败,否则返回比赛。

另外,请注意您可能只是拆分一个字符串,然后检查是否有任何一个块只包含3个_字符,仅仅是:

var str = "Word1_Word2_WORD3-maybe_Word4  Word1_Word2_WORD3 Word1_Word2_WORD3-maybe_Word4_Word5";
var res = str.Split().Any(s => s.Count(f => f == '_') == 3);
Console.WriteLine(res ? "Valid" : "Invalid");

请参阅C# demo