前方
このタイプの質問で私が抱えている問題:
- 「pqr hello world合併は、唯一の買収者として合併xyz間で行われる合併でしたが、遅れました」. の各インスタンスの後に、4 語以上離れた少なくとも 1 つのインスタンスが続きますが、各合併には独自の遅延はありません。
merger
delayed
悪いことのテストを見つけてから、プログラムロジックを使用して結果を除外または拒否する方が簡単です。
説明
この正規表現は、条件に違反するすべての文字列に一致します。正規表現が一致しない場合、その文字列は適切であると見なされます。
merger
末尾のある a はありますか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