与えられた:
ABC
content 1
123
content 2
ABC
content 3
XYZ
「ABC[\W\w]+?XYZ」の最短バージョンに一致する正規表現を作成することは可能ですか?
基本的に、私は「ABC の後に XYZ で終わる任意の文字が続きますが、間に ABC があると一致しません」を探しています (ただし、ABC は常に設定された長さであるとは限らないため、潜在的な正規表現自体と考えてください。 ..したがって、ABC または ABcC も一致する可能性があります)
したがって、より一般的には、REGEX1 の後に任意の文字が続き、REGEX2 で終了します。REGEX1 が間にある場合は一致しません。
この例では、最初の 4 行は必要ありません。
(この説明には潜在的に必要な可能性があると確信しています...さらに説明が必要です笑)
編集:
よし、これでさらに説明が必要だ!これまでの提案に感謝します。提案された各ソリューションを私の問題にどのように適用できるかを調べ始める間、少なくとも考えるべきことをすべて提供します.
提案 1:文字列の内容と正規表現を逆にします。
これは確かに、私が説明したことに基づいて問題を解決する非常に楽しいハックです。問題を単純化する際に、終了署名が後で存在する可能性があるため、同じことが逆に発生する可能性があることにも言及しませんでした(そして、私の特定の状況にあることが証明されています). これにより、以下に示す問題が発生します。
ABC
content 1
123
content 2
ABC
content 3
XYZ
content 4
MNO
content 5
XYZ
この例では、[ABC、コンテンツ 1、XYZ] をキャッチすることを意味する「XYZ を介して ABC」のようなものをチェックします...しかし、誤って [ABC、コンテンツ 1、123、コンテンツ 2、ABC、コンテンツ 3、XYZ] をキャッチします。 . これを逆にすると、再度必要な [ABC、コンテンツ 2、XYZ] の代わりに [ABC、コンテンツ 3、XYZ、コンテンツ 4、MNO、コンテンツ 5、XYZ] がキャッチされます。ポイントは、可能な限り一般化することです。これは、同じ開始署名 (この場合は正規表現 "ABC") と異なる終了署名を持つ可能性があるものも検索するためです。
この種の制限をカプセル化するように正規表現を作成する方法があれば、カスタム検索アルゴリズムを作成するよりも、このタイプの文字列で検索する正規表現を作成するときはいつでもそれを参照する方がはるかに簡単であることがわかります。それを扱います。
提案 2: A+B+C+[^A]+[^B]+[^C]+XYZ IGNORECASE フラグ付き
これは、ABC が有限である場合には良さそうです。ただし、それ自体を正規表現と考えてください。例えば:
Hello!GoodBye!Hello.Later.
私がやろうとしていることの非常に単純化されたバージョン。「Hello.Later」が欲しいです。開始の正規表現 Hello[!.] と終了の Later[!.]. Hello[!.]Later[!.] のような単純なものを実行すると、文字列全体が取得されますが、開始正規表現 Hello[!.] が見つかった最初の開始正規表現インスタンスと最初の終了正規表現の間に存在する場合、インスタンスが見つかりましたが、無視してください。
この提案の下の会話は、括弧の一致の問題と同様に、通常の言語の制限によって制限される可能性があることを示しています (Google で検索してみてください。考えるのは楽しいです)。この投稿の目的は、私が実際に直面している問題を処理する基本的なアルゴリズムを作成する必要があるかどうかを確認することです。可能であれば、それを避けたいと思います(上記の単純な例では、有限状態マシンを設計するのは非常に簡単です...少し複雑になってもそれが維持されることを願っています)。
提案 3: ABC(?:(?!ABC).)*?XYZ with DOTALL フラグ
実際に ABC を正規表現にできるのであれば、このアイデアが気に入っています。明日オフィスに着いたら、これを調べなければなりません。一見、異常なことは何もないように見えますが、私は Python 正規表現にまったく慣れていません (そして、理論上の宿題ではなく、実際に正規表現をコードに適用するのも初めてです)。