使用Regex在字符串中跳过特定数量的单词

时间:2013-07-03 11:35:30

标签: regex c#-4.0 string-search

我有一个字符串

  

“pqr你好世界合并将在xyz作为唯一的收购者之间进行,但得到了   延迟“

我想确保

  

“延迟”

总是在

之后的5个字以上
  

“合并”

如何使用正则表达式和C#实现这一目标?


解决

阅读本文后得到答案:http://www.princeton.edu/~mlovett/reference/Regular-Expressions.pdf

解决方案:

Regex.IsMatch(articlecontent.ToLower().Trim(), @"\bmerger\W+(?:\w+\W+){5," + count_of_words_in_article + @"}?\bdelayed", RegexOptions.Multiline)

这个想法是在5个单词之后找到任何距离“延迟”的“合并”。

3 个答案:

答案 0 :(得分:1)

您可以使用lookbehind

(?<=merger(\s+\w+){5}\s+)delayed

答案 1 :(得分:1)

转发

我遇到这类问题的问题:

  • 如果你有“pqr hello world merger merger 合并 xyz之间作为唯一的收购者,但得到了延迟”。 merger的每个实例后跟至少一个delayed,超过4个字,但每个合并都没有自己延迟。

更容易找到坏事的测试然后使用程序逻辑除了或拒绝结果。

描述

此正则表达式将匹配所有违反您条件的字符串。如果正则表达式不匹配,那么该字符串应该被认为是好的。

  • 是否有merger,其尾随merger
  • 每个merger都有delayed
  • 的相应实例
  • delayedmerger
  • 后的前4个单词一起显示

除了寻找坏事之外,表达式应该执行以下操作:

  • 正确处理多个字符串
  • 确保mergerdelayed不是更大词的一部分

(?:^|\s)merger(?:(?=([\s\r\n]+(?:(?!delayed\b)\w+[\r\n\s]+)*?(?:merger|$)(?:[\s\r\n]|$)))|(?=([\s\r\n]+(?:\w+[\r\n\s]+){0,4}delayed(?:[\s\r\n]|$))))

enter image description here

实施例

示例文字

注意换行符

pqr hello world merger was merger to be 
delayed undertaken between merger xyz as the sole acquirer but got delayed

<强>代码

using System;
using System.Text.RegularExpressions;
namespace myapp
{
  class Class1
    {
      static void Main(string[] args)
        {
          String sourcestring = "source string to match with pattern";
          Regex re = new Regex(@"(?:^|\s)merger(?:(?=([\s\r\n]+(?:(?!delayed\b)\w+[\r\n\s]+)*?(?:merger|$)(?:[\s\r\n]|$)))|(?=([\s\r\n]+(?:\w+[\r\n\s]+){0,4}delayed(?:[\s\r\n]|$))))",RegexOptions.IgnoreCase | RegexOptions.Singleline);
          MatchCollection mc = re.Matches(sourcestring);
          int mIdx=0;
          foreach (Match m in mc)
           {
            for (int gIdx = 0; gIdx < m.Groups.Count; gIdx++)
              {
                Console.WriteLine("[{0}][{1}] = {2}", mIdx, re.GetGroupNames()[gIdx], m.Groups[gIdx].Value);
              }
            mIdx++;
          }
        }
    }
}

<强>匹配

请注意,这些是破坏您定义的规则的错误实例。如果那里没有匹配,那么它将是一个很好的字符串。如果填充了捕获组1,则没有相应的delayed。如果填充了捕获组2,则merger在前4个单词中有delayed

[0][0] =  merger
[0][1] =  was merger 
[0][2] = 

[1][0] =  merger
[1][1] = 
[1][2] =  to be 
delayed 

答案 2 :(得分:0)

试试这个......

/merger\s+\w+\s+\w+\s+\w+\s+\w+\s+delayed/