Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从课文中找出3个单词_C#_Regex - Fatal编程技术网

C# 从课文中找出3个单词

C# 从课文中找出3个单词,c#,regex,C#,Regex,我必须写一个正则表达式才能从文本中得到三个单词。单词用一个空格隔开。我写的代码并没有给出所有的序列。 例如,对于文本123456,我只得到了两个序列:1.1232.456。但是我想让正则表达式给我所有的序列,所以输出是:1.1232.23433.345。4.456。 谁能告诉我正则表达式有什么问题吗? 这是我的密码: string input = "one two three four five six"; string pattern = @"([a-zA-Z]+ ){2}[a-z

我必须写一个正则表达式才能从文本中得到三个单词。单词用一个空格隔开。我写的代码并没有给出所有的序列。 例如,对于文本123456,我只得到了两个序列:1.1232.456。但是我想让正则表达式给我所有的序列,所以输出是:1.1232.23433.345。4.456。 谁能告诉我正则表达式有什么问题吗? 这是我的密码:

   string input = "one two three four five six";
   string pattern = @"([a-zA-Z]+ ){2}[a-zA-Z]+";
   Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);
   MatchCollection matches = rgx.Matches(input);
   if (matches.Count > 0)
   {
       Console.WriteLine("{0} ({1} matches):", input, matches.Count);
       Console.WriteLine();
       foreach (Match match in matches)
           Console.WriteLine(match.Value);
   }
   Console.ReadLine();

正则表达式没有什么问题,只是正则表达式的工作方式。当您找到一个匹配项时,对下一个匹配项的搜索将在您刚找到的匹配项的末尾继续-匹配项的宽度将被消耗

那么,如何解决这个问题呢?一种方法是让你的对手不消耗任何东西。您可以通过将原始模式置于零宽度正向前瞻断言中来实现这一点:

string pattern = @"(?=([a-zA-Z]+ ){2}[a-zA-Z]+)";
added --->         ***                        * 
?=模式表示只有在紧接着soemthing匹配模式的情况下才匹配,但内容匹配模式不是整体匹配的一部分,因此不会被使用

但是,如果它不是匹配的一部分,它就不会出现在match.Value中-那么如何获取值呢?简单-只需在原始模式(即?=模式)周围添加一个捕获组,捕获的组将正常显示在结果中

string pattern = @"(?=(([a-zA-Z]+ ){2}[a-zA-Z]+))";
added --->            *                        *
所以现在,您可以像以前一样遍历foreach循环,但是match.Value将为空-您想要的结果是match.Groups[1].Value

但现在你有另一个问题了。你的结果是

one two three
ne two three
e two three
two three four
wo three four
等等。这是因为你的模式匹配,甚至当你开始一个单词的一半

如何解决这个问题

我们添加了另一个零宽度断言,这一次是一个负的lookback:?。它不是说如果该点后面有模式,则只匹配,而是说如果该点前面有模式,则不匹配。因此,我们永远不会在字母之前匹配。例如,NE23不会返回,因为它前面有o


使用这种模式,您最终会得到预期的结果。

正则表达式没有什么问题,它只是正则表达式的工作方式。当您找到一个匹配项时,对下一个匹配项的搜索将在您刚找到的匹配项的末尾继续-匹配项的宽度将被消耗

那么,如何解决这个问题呢?一种方法是让你的对手不消耗任何东西。您可以通过将原始模式置于零宽度正向前瞻断言中来实现这一点:

string pattern = @"(?=([a-zA-Z]+ ){2}[a-zA-Z]+)";
added --->         ***                        * 
?=模式表示只有在紧接着soemthing匹配模式的情况下才匹配,但内容匹配模式不是整体匹配的一部分,因此不会被使用

但是,如果它不是匹配的一部分,它就不会出现在match.Value中-那么如何获取值呢?简单-只需在原始模式(即?=模式)周围添加一个捕获组,捕获的组将正常显示在结果中

string pattern = @"(?=(([a-zA-Z]+ ){2}[a-zA-Z]+))";
added --->            *                        *
所以现在,您可以像以前一样遍历foreach循环,但是match.Value将为空-您想要的结果是match.Groups[1].Value

但现在你有另一个问题了。你的结果是

one two three
ne two three
e two three
two three four
wo three four
等等。这是因为你的模式匹配,甚至当你开始一个单词的一半

如何解决这个问题

我们添加了另一个零宽度断言,这一次是一个负的lookback:?。它不是说如果该点后面有模式,则只匹配,而是说如果该点前面有模式,则不匹配。因此,我们永远不会在字母之前匹配。例如,NE23不会返回,因为它前面有o


使用这种模式,您最终会得到预期的结果。

我不理解这个问题。对我来说,所有的序列都是一二三,二三四,三四五和四五六是的,你是赖特,对不起。我想得到所有的序列:一二三,二三四,三四五和四五六。我已经编辑了我的问题,我不认为你只需要一个正则表达式和一次迭代就可以做你想做的事情。但是,如何使用多个正则表达式呢?我不理解这个问题。对我来说,所有的序列都是一二三,二三四,三四五和四五六是的,你是赖特,对不起。我想得到所有的序列:一二三,二三四,三四五和四五六。我已经编辑了我的问题,我不认为你只需要一个正则表达式和一次迭代就可以做你想做的事情。但是,如何使用多个正则表达式呢?@Yarik很高兴听到这个消息;我希望你能从中吸取一些东西,并在将来的不同情况下使用它:@Yarik很高兴听到它;我希望你能从中吸取一些东西,并在未来的不同情况下使用: