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