マッチャーを条件付きでサブグループと一致させたり、アサーションの結果や以前にキャプチャしたサブグループが一致するかどうかに基づいて 2 つのオプションのサブグループから選択したりすることができます。 条件付きサブグループの 2 つの構文は次のとおりです:
(?(condition)yes-pattern) (?(condition)yes-pattern|no-pattern)
条件が満たされる場合は、yes-pattern を使用し、それ以外の場合は、no-pattern (指定されている場合) を使用します。 オプションのサブグループが 3 つ以上ある場合、コンパイル時エラーが生成されます。
条件は2つあります。 (条件) のかっこが数字で構成されるテキストの場合、その数字で表される (前の) サブグループが一致した場合 (つまり、yes パターンを使用した場合)、条件は満たされます。 次のパターンを考えてみましょう。読みやすくするために空白が追加されており (PCRE_EXTENDED オプションを参照)、3 つの部分に分かれています: ( ( )? [^()]+ (?(1) ) )
パターン 最初の部分of はオプションの左括弧に一致し、その文字が出現した場合は、それをキャプチャされた部分文字列の最初のサブグループに設定します。 2 番目の部分は、1 つ以上の括弧以外の文字と一致します。 3 番目の部分は条件付きサブグループで、最初のサブグループが一致するかどうかをテストします。一致する場合、つまり、ターゲット文字列が左括弧で始まり、条件が TRUE の場合は、yes-pattern を使用します。ここでは右括弧が一致する必要があります。それ以外の場合、パターンなしが存在しないため、サブグループは何にも一致しません。つまり、このパターンは、かっこなし、または右かっこで囲まれた一連の文字と一致します。
条件文字列(R)の場合、パターンまたはサブパターンへの再帰呼び出しを取得したときに満たされます。 「トップレベル」では、条件は常に false になります。
条件が一連の数字または (R) ではない場合、それはアサーションである必要があります。ここでのアサーションは、任意、肯定的、否定的、前向き、または後ろ向きにすることができます。このパターンを考えてみましょう。読みやすくするために空白が追加され、2 行目に 2 つの代替パスが追加されています。
(?(?=[^a-z]*[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} )
条件付き小文字が後に続く小文字以外のアルファベットのオプションのシーケンスと一致する肯定的なアサーション。 つまり、ターゲットに少なくとも 1 つの小文字が存在するかどうかをテストし、小文字が見つかった場合、ターゲットは最初のオプションのブランチと一致し、それ以外の場合は 2 番目のブランチと一致します。 このパターンは、dd-aaa-dd または dd-dd-dd の 2 つの形式の文字列と一致します。 aaa は小文字、dd は数字を表します。