向前
我对这类问题的问题:
- 如果您有“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