正規表現でAND、OR、NOTをしたい
検索でAND、OR、NOTをしたい。
検索機能を実装するにあたって、そのベースとなる正規表現を作りたい。
(本当はそんなことしたくないが)
書き方
OR: 検索A|検索B
AND: ^(?=.*検索A)(?=.*検索B)
NOT: ^(?!.*検索文字列)
仕組み
ORは省略
AND
^(?=.*検索A)(?=.*検索B)
^
この部分は、『先頭の位置』を指す。
(?=)
は、直後にその後の文字列が来る『位置』を探す。
文字ではないのが重要。
先頭から、その後の文字列が来る『位置』を探すのにあたって、
検索Aの左はワイルドカードで任意の文字となるために、探査が成功した場合は先頭の位置を指す。
文字自体に干渉していないために、検索Bの検索範囲は先頭からになる。
従って、両方の文字列を満たす場所を探査することになる。
また、『直後に該当文字列が来る』位置を探すので、検索文字の後に .*
を書く必要がない
NOT
^(?!.*検索文字列)
^
この部分は、『先頭の位置』を指す。
(?!)
は、選択した文字を含まない検索を行います。
先頭から選択した文字を含まないものを探索するので、NOT検索になります。