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

问题描述 投票:-1回答:3

我有一个字符串

“pqr你好世界合并将在xyz作为唯一的收购者之间进行,但是被推迟了”

我想确保这一点

“延迟”

总是在5个字以后跟随

“合并”

.

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


Solved

读完之后得到了答案: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个单词之后找到“合并”NEAR“延迟”在任何距离。

regex c#-4.0 string-search
3个回答
1
投票

你可以使用lookbehind

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

1
投票

Forward

我遇到这类问题的问题:

  • 如果你有“pqr你好世界合并是合并xyz作为唯一的收购者,但被延迟”,会发生什么? merger的每个实例后跟至少一个距离超过4个字的delayed,但每个合并都没有它自己的延迟。

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

Description

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

  • 是否有一个merger有一个尾随merger
  • 每个merger都有相应的delayed实例
  • delayed是否出现在每个merger之后的前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]|$))))

Example

示范文本

注意换行符

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 

0
投票

试试这个...

/merger\s+\w+\s+\w+\s+\w+\s+\w+\s+delayed/
© www.soinside.com 2019 - 2024. All rights reserved.