正規表現

正規表現でのエクスクラメーションマークやビックリマーク(!)は先読み,後読み

正規表現でのエクスクラメーションマークの意味

エクスクラメーションマークは基本そのまま

正規表現におけるエクスクラメーションマーク(ビックリマーク)は、否定先読みないし否定後読み以外の用法においては基本的にそのままの記号として用います。そのため言語特有の表現等でなければエスケープしなくても使えます。

// ひらがな,カタカナ,!,スペースのいずれかを含む文字列(厳密なひらがな・カタカナ指定は別にあるが割愛)
[あ-んア-ン! ]+ 

// 検索する文字列
さすがだぞ! タイプの あいしょうを ばっちり わかって いるんだな!
さすがだぞ ガラルチャンピオン! さらに つよくなっているんだな!

// ヒットする文字列
さすがだぞ! タイプの あいしょうを ばっちり わかって いるんだな!
さすがだぞ ガラルチャンピオン! さらに つよくなっているんだな!

否定先読み,否定後読みの場合のみ特殊

エクスクラメーションマーク(ビックリマーク)は、否定先読みないし否定後読みのときのみ特殊文字としての役割を果たします。否定先読み「(?!XXXX)」はXXXXでないときに直前の位置マッチ、否定後読み「(?<!XXXX)」はXXXXでないときに直後の位置マッチします。

否定先読みは「(?!XXXX)」

正規表現にて否定先読みは「(?!XXXX)」と表します。XXXXがマッチしない場合に、「(?!XXXX)」の直前の位置にマッチする意味を持ちます。言葉だけではわかりづらいので例をみましょう。

// ピカチュウから始まらない文字列を探したい
^(?!ピカチュウ).+$

// 検索する文字列
ピカチュウのなつやすみ
ピチューとピカチュウ
ピカピカ星空キャンプ

// ヒットする文字列
ピチューとピカチュウ
ピカピカ星空キャンプ

「(?!ピカチュウ)」ではピカチュウがない場合に「(?!ピカチュウ)」の前方位置へマッチします。否定先読みと「^」を組み合わせることで、ピカチュウが文頭にない場合、文頭の位置へマッチする意味となります。そのあとは任意の文字列が続くのを意味する「.+$」で締めています。

否定後読みは「(?<!XXXX)」

正規表現にて否定後読みは「(?<!XXXX)」と表します。XXXXがマッチしない場合に、「(?<!XXXX)」の直後の位置にマッチする意味を持ちます。言葉だけではわかりづらいのでこちらも例をみましょう。

// ピカチュウで終わらない文字列を探したい
^.+(?<!ピカチュウ)$

// 検索する文字列
ピカチュウのなつやすみ
ピチューとピカチュウ
ピカピカ星空キャンプ

// ヒットする文字列
ピカチュウのなつやすみ
ピカピカ星空キャンプ

「(?<!ピカチュウ)」では文末($)にピカチュウが来ない場合の後ろ方向の位置にマッチします。「.+」は否定先読みと同様なため、ピカチュウで終わらない文字列を抽出できます。