我有一个字符串
“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个单词之后找到任何距离“延迟”的“合并”。
答案 0 :(得分:1)
您可以使用lookbehind
(?<=merger(\s+\w+){5}\s+)delayed
答案 1 :(得分:1)
我遇到这类问题的问题:
merger
的每个实例后跟至少一个delayed
,超过4个字,但每个合并都没有自己延迟。更容易找到坏事的测试然后使用程序逻辑除了或拒绝结果。
此正则表达式将匹配所有违反您条件的字符串。如果正则表达式不匹配,那么该字符串应该被认为是好的。
merger
,其尾随merger
merger
都有delayed
delayed
与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,则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/