1. ホーム
  2. regex

[解決済み】正規表現と文字グループ全体の否定【重複】について

2022-04-05 15:27:44

質問

私はあることを試みているのですが、それは私にとってかなり明白であるべきだと思うのですが、そうではありません。 私は、特定の文字列を含まない文字列にマッチさせようとしています。 私は [^ab] , [^(ab)] などを使うと、'a' や 'b' を含まない文字列、'a' のみ、'b' のみ、'ba' を含む文字列にマッチし、'ab' にはマッチしません。 私があげた例は 'ab' にはマッチしませんが、'a' だけにもマッチしません。 何か簡単な方法はないでしょうか?

どのように解決するのですか?

負のルックヘッドを使用する。

^(?!.*ab).*$

UPDATE: 以下のコメントで、このアプローチは ピーターさんの回答 . その後、いくつかのテストを行ったところ、本当にわずかに速いことがわかりました。 しかし、この手法を好む理由は、スピードではなく、シンプルであることです。

もう1つのテクニックは こちら として 強欲なトークン は、区切り文字が複数の文字で構成されている区切りテキストをマッチングするような、より複雑な問題に適しています (HTMLのように、Lukeがコメントしたように)。 以下 ). 質問にあるような問題では、やりすぎです。

興味のある方のために、私はLorem Ipsumテキストの大きな塊を使って、"quo"という単語を含まない行の数を数えてテストしてみました。 以下は私が使用した正規表現です。

(?m)^(?!.*\bquo\b).+$

(?m)^(?:(?!\bquo\b).)+$

テキスト全体を検索しても、テキストを行に分割して個別にマッチングさせても、アンカー付きのルックアヘッドは一貫してフローティングのものを上回った。