正規表現で否定を表現する

Table of Contents

常時必要ではないけれど、忘れた頃にやってきて、覚えようにも複雑な正規表現の否定表現。

いっつも検索していろんなサイトにお世話になっているけれど、訪れるサイトはいつもバラバラで、欲しい情報を見つけるのに時間がかかる。そんな毎日なので、自分用に否定表現用の記事を用意しました。

書き方

結論から先に書きます。

^(?!.\*\<ここに検索ワード\>).+$

何が起きているのか?

  • ^ : 行の先頭を表す
  • ( : グルーピング
  • ?! : 否定の先読み. 部分式が後にマッチしないなら、真とする。
  • .* : 任意の文字列(0文字以上)
  • ) : グルーピング
  • .+ : 任意の文字列(1文字以上)
  • $: 行の末尾を表す

試してみる

色々と削って動きを見てみることしました。

あいうえお
かきくけこ
あい
あ
い
いう


に対して色々試してみる。

正規表現 結果
^(?!あ) 「あ」の入っていない文字列と空改行がヒットする
^(?!あ)$ 空改行のみヒットする
^(?!あい). 「あい」の入っていない行の1文字目と空改行がヒットする
^(?!いう).* 行の先頭に「いう」の入っていない行と空改行がヒットする
^(?!.*いう).* 行に「いう」の入っていない行と空改行がヒットする
^(?!.*いう).+ 行に「いう」の入っていない行がヒットする
^(?!.*いう) 行に「いう」の入っていない行の先頭がヒットする
  • ()は()内の文字を1文字として扱う. セットみたいなイメージ.
  • ?!は否定の先読み、後ろの続く言葉がヒットしないなら真となる
  • (?!.*いう)とは「いう」がないなら真となる、いわば「いう否定セット」みたいなもの

つまり^(?!.*いう).+$とは「いう否定セット」の入っていない1文字以上を検索となる

このエントリーをはてなブックマークに追加