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

C# 正则表达式条件在最小下划线上不返回false,c#,regex,string,alphanumeric,C#,Regex,String,Alphanumeric,如果正则表达式匹配,我将使用此正则表达式 if (Regex.IsMatch(_familyname, @"(\S*_){3}\S")) 我试图确保通过测试的单词至少有这样的含义 单词1\u单词2\u单词3-maybe\u单词4(注意,单词中的连字符或空格并不重要) RegEx(\S*){3}\S也允许传递带有两个下划线的单词。 是否只有三个下划线存在正则表达式匹配,并且这些下划线之间允许有任何单词/字符/符号?哦,它也从不以下划线结束或开始。另外,如果测试第三个字母数字字符串是否都是大写字

如果正则表达式匹配,我将使用此正则表达式

 if (Regex.IsMatch(_familyname, @"(\S*_){3}\S"))
我试图确保通过测试的单词至少有这样的含义 单词1\u单词2\u单词3-maybe\u单词4(注意,单词中的连字符或空格并不重要) RegEx
(\S*){3}\S
也允许传递带有两个下划线的单词。 是否只有三个下划线存在正则表达式匹配,并且这些下划线之间允许有任何单词/字符/符号?哦,它也从不以下划线结束或开始。另外,如果测试第三个字母数字字符串是否都是大写字母,那就太好了。实际上,我使用字符串拆分实现了这一切。不过我读正则表达式可以更快吗?同样使用.NET 4.5.2,您的表达式是“贪婪的”,请尝试以下表达式:

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

有关更多信息,请参阅:

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

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

有关更多信息,请参阅:

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

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

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

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

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

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

似乎要验证一个字符串,该字符串包含一个非空白字符块,其中正好有3个下划线。这里的主要问题是
\S
也匹配一个下划线,这就是为什么您实际上需要
[^\S\u]
构造-一个与任何字符(除了空格和
之外)匹配的否定字符类

接下来,您要确保匹配的起始点前面没有非空格(它还包括
\uuu
),因此,您需要一个负查找
(?)

最后,由于您需要确保除了空格和下划线之外的第四个字符块之后没有
,因此您需要使用原子组(因为.NET正则表达式中没有所有格量词)来防止回溯到
[^\s_quot]+
模式(即,仅检查最后一个字符与
[^\s\uuu]
匹配一次后是否没有
。)

使用


请参阅。

您似乎希望验证包含非空白字符块且其中正好有3个下划线的字符串。这里的主要问题是,
\S
也与下划线匹配,这就是为什么您实际上需要
[^\S\]
construct-一个与除空格和
之外的任何字符匹配的否定字符类

接下来,您要确保匹配的起始点前面没有非空格(它还包括
\uuu
),因此,您需要一个负查找
(?)

最后,由于您需要确保除了空格和下划线之外的第四个字符块之后没有
,因此您需要使用原子组(因为.NET正则表达式中没有所有格量词)来防止回溯到
[^\s_quot]+
模式(即,仅检查最后一个字符与
[^\s\uuu]
匹配一次后是否没有
。)

使用


请参阅。

此处不太清楚您需要执行什么操作:对于
Word1\u Word2\u WORD3-maybe\u Word4
返回true,对于
Word1\u Word2\u WORD3-maybe\u Word4\u Word5
返回false?请尝试
@(?[^\s\u]+){3}(?)
请看下面我的答案。Thanx对于wiktor的努力,我目前正在参加一个会议,我会很快给你回复,让你知道如果这项工作不太清楚你需要在这里做什么:对于
单词1\u Word2\u WORD3-可能的单词4
返回true,对于
单词1\u Word2\u WORD3-可能的单词4\u Word5
返回false?尝试
@(?\u[^\ s]+){3}(?!_)"
请参见下面我的答案。Thanx对于wiktor的工作,我目前正在参加一个会议,我会很快给你回复,让你知道这是否有效。我相信这可以简化,但问题不清楚。请提供所有可能的输入类型的示例,其中1或2个字符串不应该匹配,并解释为什么不匹配(in)valid.事实上,我相信这可以简化,但问题不清楚。请举例说明所有可能的输入类型,其中1或2个字符串不应匹配,并解释它们(in)有效的原因。
var res = Regex.IsMatch(str, @"(?<!\S)[^\s_]+(?>_[^\s_]+){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");