Es posible hacer que el proceso de comparación obedezca a un sub-patrón condicionalmente o que elija entre dos sub-patrones alternativos, dependiendo del resultado de una declaración o de si un sub-patrón de captura previo coincidió o no. Las dos formas posibles de un sub-patrón condicional son
(?(condición)patrón-sí) (?(condición)patrón-sí|patrón-no)
Si la condición es satisfecha, se usa el patrón-sí; de otro modo se usa el patrón-no (si está presente). Si hay más de dos alternativas en el sub-patrón, se producirá un error en tiempo de compilación.
Hay dos tipos de condiciones. Si el texto entre los paréntesis consisite en una secuencia de dígitos, la condición es satisfecha si el sub-patrón de captura de ese número ha coincidido anteriormente. Considere el siguiente patrón, el cual contiene espacios en blanco no significativos para hacerlo más legible (se asume la opción PCRE_EXTENDED) y para dividirlo en tres partes para facilitar su discusión: ( \( )? [^()]+ (?(1) \) )
La primera parte compara un paréntesis de apertura opcional, y
si el carácter está presente, lo establece como la primera sub-cadena
capturada. La segunda parte compara uno o más caracteres
que no sean paréntesis. La tercera parte es un patrón
condicional que examina el primer conjunto de paréntesis
coincididos o no. Si lo fueron, es decir, si el sujeto comenzó
con un paréntesis de apertura, la condición es TRUE
, y así
el patrón-sí se ejecuta y es requerido un paréntesis de
cierre. De otra manera, ya que el patrón-no no está presente, el
subpatrón no coincidirá con nada. En otras palabras, este patrón
coincide con una secuencia que no tenga paréntesis, opcionalmente encerrada
entre paréntesis.
Si la condición es la cadena (R), se satisface si ha sido hecha una llamada recursiva al patrón o sub-patrón. En el "nivel superior", la condición es falsa.
Si la condición no es una secuencia de dígitos o (R), debe de ser una declaración. Ésta puede ser una declaración de búsqueda hacia delante o hacia atrás, negativa o positiva. Considere este patrón, conteniendo de nuevo espacios en blanco no significativos, y con dos alternativas en la segunda línea:
(?(?=[^a-z]*[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} )
La condición es una declaración de búsqueda hacia delante positiva que compara una secuencia opcional de algo que no sean letras seguida de una letra. En otras palabras, comprueba la presencia de al menos una letra en el sujeto. Si se encuentra una letra, el sujeto se compara con la primera alternativa; de otro modo se compara con la segunda. Este patrón coincide con cadenas en una de las dos formas dd-aaa-dd o dd-dd-dd, donde aaa son letras y dd son dígitos.