前後参照に.*?
を入れて:
(?<=wordA.*?)wordB(?=.*?wordD)
は今regex demo
を参照してください、パターンが意味:
(?<=wordA.*?)
を - (正の後読み)wordA
の存在が続く必要です直前に0以上の文字(可能な限り)を使用してください。
wordB
- ワード
(?=.*?wordD)
B - (正の先読み)は(可能な限り少数のような)任意の0+文字の存在を必要とするそれらの後
wordD
(したがって、それは
wordB
後またはいくつかの文字の後に右であることができる)を用いて行きました。
あなたは、複数行の入力を占めRegexOptions.Singleline
フラグを使用して正規表現をコンパイル.
は、改行記号と一致することができるように( - (?s)(?<=wordA.*?)wordB(?=.*?wordD)
または(?s)
インライン修飾子オプションのパターンを付加)する必要がある場合。
「言葉」は、文字/数字/アンダースコアで構成されており、あなたが単語全体としてそれらを一致させる必要がある場合は、\b
S(ワード境界)でwordA
、wordB
とwordD
をラップすることを忘れないでください。
常にターゲット環境で、あなたの正規表現をテスト:
var s = "wordA wordB wordC wordB \n wordD";
var pattern = @"(?<=wordA.*?)wordB(?=.*?wordD)";
var result = Regex.Replace(s, pattern, "<<<$&>>>", RegexOptions.Singleline);
Console.WriteLine(result);
// => wordA <<<wordB>>> wordC <<<wordB>>>
// wordD
はC# demoを参照してください。
(これは括弧で囲まれているため)単語をキャプチャしたいと思われるようです。そうであれば、もっと汎用的な変種 '\ bfirst \ b。* \ b(second)\ b。* \ bthird \ b'を[regex101](https://regex101.com)/r/SUYwrQ/2)。違いは、これは*最初の単語から3番目までのすべてにマッチしますが、* 2番目の単語だけをキャプチャする点です。これは望ましくない動作である可能性があります。もしそうであれば、@WiktorStribiżewによって行われるルックアラウンドアプローチがそれを行います。より一般的なもの以外に、私はこれがWiktorsのアプローチに何もないとは思わない。 – ClasG