web-dev-qa-db-ja.com

REGEX:KeyWord2が同じ文字列にある場合はKeyWord1を選択

KEYWORD1。NET regex engineでキャプチャしようとしていますKeyWord2が文字列に含まれています。これまでのところ、私が使用しているポジティブルックアラウンドソリューション:

(?=.*KeyWord2)**KEYWORD1** (\m\i)

RegExテストリンク

keyWord2が文字列内のKEYWORD1の後ろのどこかに配置されている場合にのみ、KEYWORD1をキャプチャします。これを正規表現で最適化して、KeyWord2の位置が前方、後方、またはその両方であるにもかかわらず、文字列内のKEYWORD1のすべてのインスタンスをキャプチャするようにするにはどうすればよいですか?

私はいくつかの洞察を本当に感謝します。

ありがとうございました

4
BWEL

\Gおよび\Kをサポートする正規表現エンジンを使用する場合、次の正規表現を使用できます。

^(?=.*\bKeyWord2\b)|\G.*?\K\bKEYWORD1\b

大文字小文字を区別しないフラグを使用し、要件に応じて複数行フラグを設定します。

PCREデモ

PCRE(PHP)および他の一部の正規表現エンジンでは、アンカー\Gは前の一致の最後と一致します。最初の一致の試みでは、\ Gは\Aと同等で、文字列の先頭に一致します。詳細は このディスカッション を参照してください。

\Kは、報告された一致の開始点を、エンジンの内部文字列ポインターの現在の位置にリセットします。以前に消費された文字は、最終的な一致には含まれません。実際、\Kは、その時点までに一致したすべてのものをエンジンに「忘れさせる」。詳細は こちら をご覧ください。

リンクに示されているように、文字列の4つの一致があります。

The KEYWORD1 before KeyWord2 then KEYWORD1 and KEYWORD1 again

これらは、文字列の先頭の空の文字列と、KEYWORD1の3つのインスタンスのそれぞれです。実際、一致したすべての文字列について、一致の1つは文字列の先頭にある空の文字列になります。したがって、空の文字列は置換を行うときに無視する必要があります。

1
Cary Swoveland