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

问题描述 投票:3回答:3

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

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

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

c# regex string alphanumeric
3个回答
0
投票

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

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

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


0
投票

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

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


0
投票

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

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

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

使用

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

regex demo

细节:

  • (?<!\S) - 负面的lookbehind确保在当前位置的左边没有非空白字符
  • [^\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

© www.soinside.com 2019 - 2024. All rights reserved.