【问题标题】:Get 3 words from the text从文本中获取 3 个单词
【发布时间】:2013-01-22 12:27:10
【问题描述】:

我必须编写一个正则表达式才能从文本中获取三个单词。单词用一个空格分隔。我写的代码不是给我所有的序列。 例如对于文本“一二三四五六”,我只有两个序列:1.一二三 2.四五六。但我希望我的正则表达式给我所有的序列,所以输出将是:1.一二三 2.二三四 3.三四五。 4.四五六。 有人可以告诉我我的正则表达式有什么问题吗? 这是我的代码:

   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();

【问题讨论】:

  • 我不明白这个问题。对我来说,所有序列都是一二三二三四三四五四五六
  • 是的,你是对的,对不起。我想得到所有的序列:一二三、二三四、三四五和四五六。我已经编辑了我的问题
  • 我认为你不能只用一个正则表达式和一个迭代来做你想做的事。
  • 但是如何使用多个正则表达式呢?

标签: c# regex


【解决方案1】:

您的正则表达式没有任何问题 - 这就是正则表达式的工作原理。当您找到匹配项时,将在刚刚找到的匹配项的末尾继续搜索下一个匹配项 - 匹配项的宽度已消耗

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

string pattern = @"(?=([a-zA-Z]+ ){2}[a-zA-Z]+)";
added --->         ***                        * 

(?=pattern) 表示“仅当紧随其后的是匹配 pattern 的某些内容时才匹配” - 但匹配 pattern 的内容不是整体匹配的一部分,因此不会被消耗。

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

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

等等。这是因为您的模式匹配即使您从单词中途开始

如何解决这个问题?

我们添加了另一个零宽度断言,这一次是一个否定的lookbehind(?<![a-zA-Z])。它不是说“仅当该点后面跟着模式时才匹配”,而是说“从不匹配,如果该点在模式之前之后”。因此,我们永远不会匹配一个字母之前的点。例如,ne two three 不会返回,因为它前面有 o

string pattern = @"(?<![a-zA-Z])(?=(([a-zA-Z]+ ){2}[a-zA-Z]+))";
added --->         *************

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

【讨论】:

  • @Yarik 很高兴听到它;我希望你能从中得到一些东西,并在未来的不同情况下使用它:)
猜你喜欢
  • 2019-06-13
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多