「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).)*
—————–
くどいようだが赤字はあくまでも位置を示す。