【正規表現】文字列の否定、ある文字列を含まない

この記事について

環境正規表現
目的「ある文字列を含まない」パターンを書く
結果否定的先読み(?!~)を使う。^(?!.*abc).+$ で「abc」を含まない行にマッチ

つまずきポイント要約

  • (?!~)はマッチする文字列でなく「位置」を示すだけ。^や$と同じ扱いと考えると理解しやすい

「abc」という文字列で始まらない

^(?!abc).+$

文頭から文末まで「abc」という文字列を含まない

^(?!.*abc).+$

文字列start~endまでに「abc」という文字列を含まない

start(?:(?!abc).)*?end

参考URL:
http://ynomura.dip.jp/archives/2015/12/post_53.html

Aの直後から「abc」という文字列を含まない繰り返し

A((?!abc).)*?

直後に「ABC」も「XYZ」もこないY

Y(?!(ABC|XYZ))

↓↓もう少し詳しく理解する。↓↓

(?!」と「)」で文字列を囲む正規表現を否定的先読みという。

これを利用すると、囲まれた文字(パターン)がある文字の直後に存在しない位置にマッチする。普通、正規表現はマッチする文字列を見つけるが、(?!――)はその位置を見つけるだけである。「^」が行頭、「$」が行末の場所を示すのと同じように(?!――)も場所を示すだけ

次のパターンと比較すると理解しやすい。

行頭から続く文字を繰り返している

^.*

(Aの直後から)abcという文字列を含まない位置にある文字を繰り返している

A((?!abc).)*

くどいようだが赤字はあくまでも位置を示す。

関連記事

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