サブパターンサブパターンは、丸カッコで括られたパターンのことで、ネストも可能です。 パターンの一部をサブパターンにすると、以下の 2 つのことが可能になります。
例えば、文字列 "the red king" に対し、パターン the ((red|white) (king|queen))をマッチングさせた場合、キャプチャされる部分文字列は、 "red king", "red", "king" であり、 それぞれ 1 番, 2 番, 3 番と番号がふられます。 カッコに 2 つの機能があるということが、いつも良い方に働くわけでは ありません。値をキャプチャする必要はないが、グループ分けのために サブパターンを複数用いたい場合も少なくありません。開きカッコの後に "?:" を付けると、そのサブパターンは値のキャプチャを行わず、 キャプチャ用サブパターンの番号としてもカウントされません。例えば、 文字列 "the white queen" に対し、次のパターンをマッチングさせてみましょう。 the ((?:red|white) (king|queen))キャプチャされる部分文字列は、"white queen" と "queen" であり、 それぞれ 1 番と 2 番に番号付けされます。キャプチャ可能な部分文字列の 数は最大で 65535 までです。 そんな大量のパターンをコンパイルするのはそもそも無理かもしれませんが、 そのあたりは libpcre の configure 時のオプションしだいです。 簡略形として、値のキャプチャをしないサブパターンの先頭で オプションの設定をする場合、オプションの文字を "?" と ":" の間に入れることができます。つまり、次の 2 つのパターン、 (?i:saturday|sunday) (?:(?i)saturday|sunday) は、まったく同じ文字列集合にマッチします。 選択肢は左から右に試行され、オプションはサブパターンの終端に達するまで リセットされないので、ある選択枝にあるオプション設定は後に続く 選択枝にも作用します。このため、上のパターンは、"Saturday" と同様に "SUNDAY" にもマッチします
複数の条件にマッチさせたいときに、
ひとつの正規表現の中でサブグループを切り替えなければならないこともあります。
通常は、たとえその中のいずれかひとつにしかマッチしなかったとしても
それぞれに個別の後方参照番号が振られます。
これを解決するために使えるのが (?:(Sat)ur|(Sun))day
(?|(Sat)ur|(Sun))day
このパターンを使えば、 |