正規表現のlookaheadは文字列を消費しません。^(?=.*hoge)で行全体を先頭からlookaheadできます。この二つを用いることで、ある文字列を行に含む、含まないの組み合わせを正規表現で自由に作ることが出来ます。基本パーツは次の四つです。
^(?=.*hoge).*$ | hogeを含む行 | |
^(?!.*hoge).*$ | hogeを含まない行 | not A |
^(?=.*hoge)(?=.*fuga).*$ | hogeとfugaを含む行 | A and B |
^((?=.*hoge)|(?=.*fuga)).*$ | hogeかfugaを含む行 | A or B |
hoge,fugaにはそれぞれのかっことその中身を当てはめられます。これらを組み合わせて、好きに長い検索ができます。ABとBCの組み合わせかCDを含み、DEかCAを含まない行ならば((AB and BC) or CD) and not (DE and CA)であり、
^((?=.*AB)(?=.*BC)|(?=.*CD))(?!.*(?=.*DE)(?=.*CA)).*$
となります。