正規表現での、OR(いずれか、または)の表現方法

最終更新:2021-05-01 by Joe

正規表現にいて、複数のパターンのうち「いずれか、または」を意味する「OR」を表現する方法についてです。

正規表現での「OR(または)」の記述方法

正規表現で「複数のパターンのうち、いずれか」といった論理和を表す「OR(または)」を記述するには、大きく2つの方法があります。

  1. 「|(パイプ)」を利用した OR の表現
  2. 文字クラスを利用した OR の表現

それでは、順番に詳しく見ていきます。

1「|(パイプ)」を利用した OR の表現

もっとも基本的な OR の表現は、メタ文字「|(パイプ)」を利用した表現です。候補となる複数の正規表現パターン同士を「|」でつなぎます。| で並列された、それぞれの正規表現パターンのいずれかが一致すれば、マッチングが成立します。

// 「Now」or「Never」のいずれか
Now|Never

// 「そば」or「うどん」or 「ラーメン」のいずれか
そば|うどん|ラーメン 

上記の例で分かるように「|」は、ひと続きの正表現パターン同士をまるごと対象とし、OR関係を記述します。そうではなく、正規表現パターンの範囲を限定したい場合、括弧を使ってグルーピングする必要があります。

下記は、OR が対象とする正規表現をリテラル一文字に限定した例です。(リテラルとは「普通のテキスト」の正規表現という意味です)

// 「こんばんは」 or「こんばんみ」のいずれか
こんばん(は|み)

2文字クラスを利用した OR の表現

文字クラスの「[](角括弧)」を利用すれば、リテラル一文字単位で、複数の文字の OR 関係を容易に表現できます。

// ABCD のいずれかの一文字
[ABCD]

// 「こんばんは」、「こんばんみ」、「こんばんわ」のいずれか
こんばん[はみわ]

// 090、080、050 のいずれか
0[985]0

文字クラスで扱えるパターンは「リテラル1文字だけ」です。複数の文字からなる「文字列」同士のORを表現することはできませんので、注意して下さい。

括弧による文字列の OR 関係と、後方参照

ちなみに、括弧を使ってOR対象をグルーピングした文字は、マッチするとキャプチャされ、後方参照の対象となりますので、注意が必要です。PHPの例です。

<?php
// 正規表現パターン
$pattern = '/こんばん(は|み)/';

// 対象文字列
$subject = 'こんばんみ';

// マッチング文字列をキャプチャする
if ( preg_match($pattern, $subject,  $matches) ) {
  var_dump($matches);
}
?>

// 出力。括弧で囲んだサブパターンもキャプチャ対象となる
array (size=2)
 0 => string 'こんばんみ' (length=15)
 1 => string 'み' (length=3)

キャプチャされる事を避けるには、「(?:」「)」という括弧を利用すれば、マッチしたパターンをキャプチャしないグルーピングが可能です。

<?php
// 正規表現パターン。
$pattern = '/こんばん(?:は|み)/';

// 対象文字列
$subject = 'こんばんみ';

// マッチング文字列をキャプチャする
if ( preg_match($pattern, $subject,  $matches) ) {
  var_dump($matches);
}
?>
// 出力、サブパターンは含まれない
array (size=2)
 0 => string 'こんばんみ' (length=15)

正規表現の OR に関する参考情報

今回は論理和「OR(いずれか、または)」を掘り下げてみましたが、こちらは正規表現の基本的なメタ文字の一覧です。

また、こちらはAND(かつ)の表現です。