如果RegEx匹配,我正在使用此RegEx
if (Regex.IsMatch(_familyname, @"(\S*_){3}\S"))
我试图确保通过测试的单词至少有这个
Word1_Word2_WORD3-maybe_Word4(注意字内的连字符或空格并不重要)
RegEx (\S*_){3}\S
允许带有两个下划线的单词也通过。
是否只有三个下划线的RegEx匹配,并且这些下划线之间允许任何单词/字符/符号?哦它也永远不会结束或以下划线开头。此外,如果测试第三个字母数字字符串是所有大写字母将是伟大的。实际上我用字符串拆分实现了这一切。不过我读RegEx可以更快吗?还使用.NET 4.5.2
答案 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_]+
- 除了空白和_
(?>
- 原子团的开始
_
- 下划线[^\s_]+
- 除了空白和_
){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。