-1

我有一个字符串

“pqr hello world 合并本应在 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 个单词后的任意距离处找到“合并” NEAR “延迟”。

4

3 回答 3

1

向前

我对这类问题的问题:

  • 如果您有“pqr hello world合并是在合并xyz 作为唯一收购方之间进行的合并但被延迟了”,会发生什么情况。每个实例merger后面至少有一个delayed超过 4 个单词的实例,但是每个合并都没有它自己的延迟。

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

描述

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

  • 有没有merger尾随的merger
  • 每个merger都有对应的实例delayed
  • 是否delayed出现在每个单词之后的前 4 个单词merger

除了寻找不好的事情之外,表达式还应该执行以下操作:

  • 正确处理多行字符串
  • 确保merger并且delayed不是更大单词的一部分

(?:^|\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]|$))))

在此处输入图像描述

例子

示例文本

注意换行符

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,则在前 4 个单词中merger有 a 。delayed

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

[1][0] =  merger
[1][1] = 
[1][2] =  to be 
delayed 
于 2013-07-04T02:17:40.030 回答
1

你可以使用lookbehind

(?<=merger(\s+\w+){5}\s+)delayed
于 2013-07-03T11:37:49.243 回答
0

尝试这个...

/merger\s+\w+\s+\w+\s+\w+\s+\w+\s+delayed/
于 2013-07-03T12:52:56.017 回答