【解決方法】正規表現 – 特定の単語を一致させる方法は?


テキスト内の特定の単語を照合する必要がありますが、それらが括弧内にある場合 (他の単語の有無にかかわらず) は一致しません。

たとえば、本文では

フランス民法典の初版は、法的なやり取りを改善するために行われた二重の反省の集大成です…(フランス民法典の版)は…

最初の「コード市民」の単語を一致させる必要がありますが、最後の単語 (括弧内) は一致させる必要はありません。

次の正規表現を使用しています

JavaScript
/[^(]code (civil|pénal|de procédure civile|de procédure pénale)[^)]/g

問題は、上記の例を参照すると、RE が「code Civil」の前後のスペースにも一致することです (つまり、「 code Civil 」)。

これらのスペースを削除するにはどうすればよいですか?

前もって感謝します。

私が試したこと:

JavaScript
/[^(]code (civil|pénal|de procédure civile|de procédure pénale)[^)]/g

解決策 1

以下を使用して一致を取得できました。

(?![^(]*\))\s*(code (?:civil|pénal|de procédure civile|de procédure pénale))\s*

これを分解するには:

(?![^(]*\))

これは否定的な先読みであり、テキストが ( で終わり、 ). これで注意することが重要だと思います 意思 用語が閉じ記号なしで括弧内にある場合に一致します。

\s*

これにより、ゼロ個以上のスペースがチェックされます。 これを前に置くことで、 code 単語の周りのスペースをキャプチャしたくないと言っている部分です。

(code (?:civil|pénal|de procédure civile|de procédure pénale))

これにより、テキスト全体が一致グループの一部としてキャプチャされます。 テキスト全体ではなく、一致した最初のグループを選択するようにコードを調整する必要があります。 の (?: ... ) bit は単に「これを一致させたいが、別のグループにしたくない」という意味です。

他の誰かがこれをキャプチャするより良い方法を持っているかもしれませんが、私はこれをでテストしました 正規表現101[^] そしてそれはうまくいったようです!

解決策 2

問題はそれです

正規表現
[^(]

文字通り「開いた括弧ではないものに一致する」ことを意味します-したがって、問題になるのはスペースだけではありません-「(」以外の「コード」の前の任意の文字が一致します.

個人的には、これを行うために 1 つの Regex を使用することはありません。1 つの Regex を使用して、括弧とその中のすべてを削除します。

正規表現
\(.*?\)

そして、結果の文字列を処理して、必要なコンテンツをチェックします。

単一の Regex でこれを行うことは可能かもしれませんが (可能か不可能かは言いませんが)、結果の式は恐ろしく複雑になり、後で維持することはほとんど不可能になります。 2 つに分割すると、読みやすくなり、アプリの信頼性と保守性が向上します。

コメント

タイトルとURLをコピーしました