正規表現にいて、複数のパターンのうち「いずれか、または」を意味する「OR」を表現する方法についてです。
目次
正規表現での「OR(または)」の記述方法
正規表現で「複数のパターンのうち、いずれか」といった論理和を表す「OR(または)」を記述するには、大きく2つの方法があります。
- 「|(パイプ)」を利用した OR の表現
- 文字クラスを利用した 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(かつ)の表現です。