サブパターンは、丸カッコで括られたパターンのことで、ネストも可能です。 パターンの一部をサブパターンにすると、以下の 2 つのことが可能になります。
1. 選択肢の範囲の指定 (localize)。例えば、パターン
cat(aract|erpillar|)は、単語 "cat", "cataract", "caterpillar" にマッチします。 カッコをつけないと、このパターンは、"cataract", "erpillar" または空の文字列にマッチしてしまいます。
2. サブパターンによる値の取得(キャプチャ)。 パターン全体としてマッチに成功した場合、対象文字列の内、 サブパターンにマッチした部分の値がコールした側に返されます。 開きカッコの数が(1 から始まって)左から右に数えられ、 キャプチャ用サブパターン (capturing subpattern) の番号が指定されます。
例えば、文字列 "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 番に番号付けされます。キャプチャ可能な部分文字列の 数は最大で 99 までです。また、キャプチャを行うものと行わないものを 合わせて、サブパターンの数は最大 200 までです。
簡略形として、値のキャプチャをしないサブパターンの先頭で オプションの設定をする場合、オプションの文字を "?" と ":" の間に入れることができます。つまり、次の 2 つのパターン、
(?i:saturday|sunday) (?:(?i)saturday|sunday)
は、まったく同じ文字列集合にマッチします。 選択肢は左から右に試行され、オプションはサブパターンの終端に達するまで リセットされないので、ある選択枝にあるオプション設定は後に続く 選択枝にも作用します。このため、上のパターンは、"Saturday" と同様に "SUNDAY" にもマッチします
PHP 4.3.3 以降、(?P<name>pattern) という記法を用いて サブパターンに名前をつけることができる様になりました。 マッチ時に返される配列には、番号による添字に加えて、指定した文字列を添字とする 要素も含まれます。