正则表达式有条件不在最小下划线上返回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}(?!_)");
细节:
(?<!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的主要内容,如果未能解决你的问题,请参考以下文章