正規表現

正規表現でOR(いずれか,または)を表す方法 | キャプチャの回避法

正規表現のOR条件
記事の要約
  • いずれか一文字は、[あいうえお]
  • いずれか一文字以外は、[^あいうえお]
  • いずれか二文字以上は、ピカチュウ|ライチュウ
  • いずれか二文字以上を取り入れるときは、(ピカチュウ|ライチュウ)

正規表現でORを表す”[ ]”と” | “

正規表現でOR(いずれか,または)を表すには、”[]”(大括弧,角括弧,ブラケット)を使うか、”|”(縦棒,パイプ)を使うのが有効です。例えばABCの一文字を表す場合には”[ABC]“、バナナかリンゴの二文字以上を表す場合には”バナナ|リンゴ“と記載します。

いずれか一文字は”[ ]”

いずれか一文字は“[ ]”の記号を用いて表現します。”[ ]”内にマッチさせたい文字や記号を入れると、それらの文字のいずれかの場合にヒットするようになります。

// 「あいうえお」のいずれかにヒットさせたい
[あいうえお]

// 「水タイプ」「草タイプ」「炎タイプ」のいずれかにヒットさせたい
[水草炎]タイプ

いずれか一文字の否定は”[^ ]”

いずれか一文字を含まない場合は“[^ ]”の記号を用いて表現します。”[ ]”内にマッチさせたくない文字入れた後、”[“のあとに”^”の記号を追記しましょう。

// 「かきくけこ」のいずれかにもヒットしないようにさせたい
[^かきくけこ]

// 「1ばんどうろ」「2ばんどうろ」「3ばんどうろ」以外のどうろにヒットさせたい
[^123]ばんどうろ

いずれか二文字以上は “|(パイプ)”

いずれか二文字以上の場合は”|”の記号を用いて表現します。OR条件にしたい文字列を”|”ではさみながら列挙していきましょう。

// 「シャワーズ」「ブースター」「サンダース」のいずれかにヒットさせたい
シャワーズ|ブースター|サンダース

組み込むときは”( | )”

ほかの正規表現と組み合わていずれか二文字以上を表したい場合は”|”と”( )”の記号を用います。”|”でOR条件にしたい文字列をはさむのはそのままに、最初と最後を”( )”でくくりましょう。

// 「みずのいし」「ほのおのいし」「かみなりのいし」のいずれかにヒットさせたい
(みず|ほのお|かみなり)のいし

// 「フシギダネ」「フシギソウ」「フシギバナ」のいずれかにヒットさせたい
フシギ(ダネ|ソウ|バナ)

“( | )”を使う際の注意点

二文字以上のいずれかを表現できる”( | )”は便利ですが、文字列の抽出をする際には意図しない挙動になる恐れがあります。単刀直入にいうと、キャプチャされるのを回避したい場合には”(?: )”のような表現が必要です。

前提:”( )”はグループを表すメタ文字

前提として、“( )”は正規表現上ではグループ化と呼ばれ、これ単体で特殊な意味になります。”( )”の直後に繰り返しの記号がつけば”( )”の中身全体を繰り返すほか、肯定先読みや否定先読みにも活用されます。

// 「ピカ」を1回以上繰り返している文字列をヒットさせたい
(ピカ)+

// 「ピカ」を2回〜5回繰り返している文字列をヒットさせたい
(ピカ){2,5}

// 「ライチュウ」を含まない文字列にヒットさせたい
^(?!.*ライチュウ).*$

さきほどまで解説していた”( | )”は、”|”にて二文字以上のORとした表現に対して”( )”でグループ化することで他の表現と組み合わせて使えるようになっていました。

グループはキャプチャ(抽出)されてしまう

そんな”( )”ですがグループ化するという特徴とあわせて、キャプチャをするという役割も持ち合わせています。たとえば次の文字列に対して「フシギ」を含んだ文字列全体をヒットさせたいとします。

  • フシギダネ
  • フシギソウ
  • フシギバナ

この場合に使用する正規表現を仮に↓とします。

// 「フシギ」を含んだ文字列全体をヒットさせたい
フシギ(ダネ|ソウ|バナ)

しかしそのまま文字列をいれてしまうと、抽出される文字列は「ダネ」「ソウ」「バナ」となってしまいます。

これは”( )”のグループ化には、”( )”内の文字列を抽出するという役割も持っているためです。そのため単純に二文字以上のいずれかを抽出したいからといって”( | )”を使用すると、キャプチャされる文字列が想定外のものになってしまう事象が発生します。

キャプチャを回避するには”(?: )”

そのため二文字以上のいずれかとして用いたいが抽出を限定する役割はなくしたい場合には、”(?: )”のような形での表現が必要です。フシギ(ダネ|ソウ|バナ)の場合にはフシギ(?:ダネ|ソウ|バナ)とすれば”( | )”内だけの抽出を回避できます。