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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式有条件不在最小下划线上返回false相关的知识,希望对你有一定的参考价值。

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

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

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

答案

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

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

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

另一答案

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

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

另一答案

您似乎想验证一个字符串,该字符串包含一组非空白字符,其中包含正好有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

以上是关于正则表达式有条件不在最小下划线上返回false的主要内容,如果未能解决你的问题,请参考以下文章

js正则归纳总结

正则

PHP正则匹配6到16位字符组合(且只能为数字字母下划线)

C# 正则表达式匹配总是返回 false

正则表达式语法

字母和空格的正则表达式