Está en la página 1de 24

Delimitadores

Cuando se usan funciones PCRE, se requiere que el patrn est encerrado


entre delimitadores. Un delimitador puede ser cualquier carcter no
alfanumrico, que no sea una barra invertida, y que no sea un espacio en
blanco.
Los delimitadores que se usan a menudo son barras oblcuas (/), signos de
nmero (#) y virgulillas (~). Los siguientes ejemplos son todos patrones
delimitados vlidos.
/foo bar/
#^[^0-9]$#
+php+
%[a-zA-Z0-9_-]%
Tambin es posible utilizar los delimitadores estilo corchete, donde los
corchetes de apertura y cierre son los delimitadores inicial y final,
respectivamente. (), {}, [] y <> son todos pares de delimitadores vlidos.
(this [is] a (pattern))
{this [is] a (pattern)}
[this [is] a (pattern)]
<this [is] a (pattern)>
Bracket style delimiters do not need to be escaped when they are used as
meta characters within the pattern, but as with other delimiters they must
be escaped when they are used as literal characters.
Si el delimitador necesita ser comparado dentro del patrn se debe escapar
usando una barra invertida. Si el delimitador aparece a menudo dentro del
patrn, es una buena idea escoger otro delimitador para aumentar la
legibilidad.
/http:\/\//
#http://#
La funcin preg_quote() se puede usar para escapar una cadena para
inyectarla dentro de un patrn y su segundo parmetro opcional de puede
usar parar especificar el delimitador a escapar.
Puede aadir modificadores de patrn despus del delimitador final. El
siguiente es un ejemplo de comparacin insensible a maysculasminsculas:
Metacaracteres
El poder de las expresiones regulares viene dado por la capacidad de incluir
alternativas y repeticiones en el patrn. stos estn codificadoes en el
patrn por el uso de metacaracteres, los cuales no se representan a s
mismos, sino que son interpretados de una forma especial.
Hay dos conjuntos diferentes de metacaracteres: aqullos que son
reconocidos en cualquier lugar de un patrn excepto dentro de los
corchetes, y aqullos que son reconocidos dentro de los corchetes. Fuera de
los corchetes, los metacaracteres son los siguientes:

Metacaracteres fuera de corchetes


Metacar
Descripcin
cter
\
carcter de escape general con varios usos
^
declaracin de inicio de sujeto (o lnea, en modo multilnea)
declaracin de fin de sujeto o antes de la terminacin de nueva
$
lnea (o fin lnea, en modo multilnea)
coincide con cualquier carcter excepto con el de nueva lnea
.
(por defecto)
[
inicio de la definicin de la clase carcter
]
fin de la definicin de la clase carcter
|
inicio de rama alternativa
(
inicio de sub-patrn
)
fin de sub-patrn
amplia el significado de (, tambin cuantificador 0 o 1, tambin
?
hace perezosos a los cuantificadores codiciosos (vase
repeticin)
*
cuantificador 0 o ms
+
cuantificador 1 o ms
{
inicio de cuantificador mn/mx
}
fin de cuantificador mn/mx
La parte de un patrn que est entre corchetes se llama una clase carcter.
En una clase carcter los nicos metacaracteres son:
Metacaracteres dentro de corchetes (clases carcter)
Metacarcter Descripcin
\
carcter de escape general
^
niega la clase, pero slo si se trata del primer carcter
indica el rango de caracteres
Las siguientes secciones describen el uso de cada metacarcter.
Secuencias de escape
El carcter barra invertida tiene varios usos. El primero es que si est
seguido de un carcter no alfanumrico, toma cualquier significado especial
que el carcter pueda tener. Este uso de la barra invertida como carcter de
escape se aplica tanto dentro como fuera de las clases carcter.
Por ejemplo, si quiere coincidir un carcter "*", escriba "\*" en el patrn.
Esto se aplica aunque el siguiente carcter pudiera ser interpretado como
un metacarcter, por lo que es mejor asegurarse de preceder un carcter
no alfanumrico con "\" para especificar que ste se representa a s mismo.
En particular, si quiere coincidir una barra invertida, escriba "\\".
Nota:

Las cadenas PHP entre comillas simples y dobles tienen un significado


especial para la barra invertida. As, si \ ha de ser comparado con una
expresin regular \\, entonces se debe usar "\\\\" o '\\\\' en cdigo PHP.
Si un patrn es compilado con la opcin PCRE_EXTENDED, los espacios en
blanco en el patrn (distinto de una clase carcter) y los caracteres entre un
"#" fuera de una clase carcter y el siguiente carcter de nueva lnea se
ignoran. Una barra invertida de escape se puede usar para incluir un
carcter espacio en blanco o "#" como parte del patrn.
Un segundo uso de la barra invertida proporciona una manera de codificar
caracteres no imprimibles en patrones de una forma visible. No hay
restricciones en la aparicin de los caracteres no imprimibles, excepto para
el cero binario el cual finaliza el patrn, pero cuando un patrn est siendo
preparado para edicin de texto, normalmente es ms fcil usar una de las
siguientes secuencias de escape en vez del carcter binario que
representan:
\a alarma, es decir, el carcter BEL (07 hex)
\cx "control-x", donde x es cualquier carcter
\e escape (1B hex)
\f salto de pgina (0C hex)
\n nueva lnea (0A hex)
\p{xx} un carcter con la propiedad xx, vase propiedades unicode
para ms informacin
\P{xx} un carcter sin la propiedad xx, vase propiedades unicode
para ms informacin
\r retorno de carro (0D hex)
\R salto de lnea: coincide con \n, \r y \r\n
\t tabulador (09 hex)
\xhh carcter con el cdigo hexadecimal hh
\ddd carcter con el cdigo octal ddd, o retroreferencia
El efecto exacto de "\cx" es como sigue: si "x" es una letra minscula, sta
se convierte a mayscula. Despus se invierte el bit 6 del carcter (40 hex).
As, "\cz" se convierte en 1A hex, pero "\c{" se convierte en 3B hex,
mientras que "\c;" se conviente en 7B hex.
Despus de "\x", se leen hasta dos dgitos hexadecimales (las letras pueden
ser tanto maysculas como minsculas). En modo UTF-8, "\x{...}" es
permitido, donde el contenido entre las llaves es una cadena de dgitos
hexadecimales. Esto se interpreta como un carcter UTF-8 cuyo nmero de
cdigo es el dado por el nmero hexadecimal. La secuencia de escape
hexadecimal original, \xhh, conincide con un carcter UTF-8 de dos bytes si
el valor es mayor que 127.
Despus de "\0", se leen hasta dos dgitos octales ms. En cualquier caso, si
hay menos de dos dgitos, slo se usan aqullos que estn presentes. As, la
secuencia "\0\x\07" especifica dos ceros binarios seguidos de un carcter

BEL. Asegrese de proporcionar dos dgitos despus del cero inicial si el


carcter que sigue es tambin un dgito octal.
El manejo de una barra invertida seguida de un dgito distinto de 0 es
complicado. Fuera de una clase carcter, PCRE lee este dgito, as como
cualesquiera dgitos siguientes, como un nmero decimal. Si el nmero es
menor que 10, o si ha habido al menos tantas capturas previas hacia la
izquierda en la expresin, la secuencia entera es tomada como una
retroreferencia. Una descripcin de cmo funciona esto se da ms adelante,
seguido de una discusin sobre sub-patrones entre parntesis.
Dentro de una clase carcter, o si el nmero decimal es mayor que 9 y no
han habido tantos sub-patrones de captura, PCRE relee hasta tres dgitos
octales siguientes a la barra invertida, y genera un slo byte de los 8 bits
menos significativos del valor. Cualesquiera dgitos subsiguientes se
representan a s mismos. Por ejemplo:
\040 es otra manera de escribir un espacio
\40 es lo mismo, siempre que haya menos de 40 sub-patrones de
captura previos
\7 es siempre una retroreferencia
\11 puede ser una retrorefenrencia, u otra manera de escribir una
tabulacin
\011 es siempre una tabulacin
\0113 es una tabulacin seguida del carcter "3"
\113 es el carcter con el cdigo octal 113 (ya que no puede haber
ms de 99 retroreferencias)
\377 es un byte consistente en bits 1 enteramente
\81 es tanto una retroreferencia como un cero binario seguido de
los caracteres "8" y "1"
Observe que los valores octales 100 y mayores no deben ser precedidos por
un cero inicial, ya que nunca se leen ms de tres dgitos octales.
Todas las secuencias que definen un valor de byte nico se pueden usar
tanto dentro como fuera de las clases carcter. Adems, dentro de una
clase carcter, la secuencia "\b" se interpreta como el carcter retroceso
(08 hex). Fuera de una clase carcter tiene diferentes significados (vase
ms abajo).
El tercer uso de la barra invertida es parar especificar tipos de caracteres
genricos:
\d cualquier dgito decimal
\D cualquier carcter que no es un dgito decimal
\h cualquier carcter espacio en blanco horizontal (desde PHP
5.2.4)
\H cualquier carcter que no es un carcter espacio en blanco
horizontal (desde PHP 5.2.4)

\s cualquier carcter espacio en blanco


\S cualquier carcter que no es un carcter espacio en blanco
\v cualquier carcter espacio en blanco vertical (desde PHP 5.2.4)
\V cualquier carcter que no es un carcter espacio en blanco
vertical (desde PHP 5.2.4)
\w cualquier carcter "palabra"
\W cualquier carcter que no es "palabra"
Cada par de sencuencias de escape divide el conjunto completo de
caracteres en dos conjuntos separados. Cualquier carcter dado concide
con uno, y slo uno, de cada par.
Los caracters "espacios en blanco" son HT (9), LF (10), FF (12), CR (13), y el
espacio (32). Sin embargo, si ocurre una coincidencia especfica de una
regin, los caracteres con puntos de cdigo en el rango 128-255 podran
tambin considerarse como caracteres de espacio en blanco, por ejemplo,
NBSP (A0).
Un carcter "palabra" es cualquier letra o dgito o el carcter subrayado, es
decir, cualquier carcter que pueda ser parte de una "palabra" Perl. La
definicin de letras y dgitos est controlada por las tablas de caracteres de
PCRE, y pueden variar si tiene lugar la comparacin de configuraciones
regionales especficas. Por ejemplo, en la configuracin regional "fr"
(Francs), algunos cdigos de caracteres mayores que 128 se usan para
letras acentuadas, y stos se comparan por \w.
Estas secuencias de tipo de caracteres puede aparecer tanto dentro como
fuera de las clases carcter. Cada una coincide con un carcter del tipo
apropiado. Si el punto de coincidencia actual est al final de la cadena
objetivo, todas ellas fallarn, ya que no hay caracteres a comparar.
El cuarto uso de la barra invertida es para ciertas declaraciones simples.
Una declaracin especifica una condicin que se debe encontrar en un
punto particular de una comparacin, sin consumir ningn carcter de la
cadena objetivo. El uso de sub-patrones para declaraciones ms
complicadas se describe despus. Las declaraciones de la barra invertida
son
\b lmite de palabra
\B distinto a lmite de palabra
\A comienzo del sujeto (independientemente del modo multilnea)
\Z fin del sujeto o nueva lnea al final (independientemente del
modo multilnea)
\z final del sujeto (independientemente del modo multilnea)
\G primera posicin de coincidencia del sujeto
Estas declaraciones pueden no aparecer en clases carcter (pero observe
que "\b" tiene un significado diferente, a saber, el carcter retroceso, dentro
de una clase carcter).
Un lmite de palabra es una posicin en la cadena objetivo donde el carcter
actual y el carcter previo no coinciden con \w o \W (es decir, uno coincide

con \w y el otro coincice con \W), o el inicio o final de la cadena si el primer


o ltimo carcter coincide con \w, respectivamente.
Las declaraciones \A, \Z, y \z difieren de los tradicionales circumflejo y dlar
(descritos en anclas) de modo que siempre coinciden con el inicio y final
absolutos de la cadena objetivo, sin importar las opciones que se apliquen.
No les afectan las opciones PCRE_MULTILINE o PCRE_DOLLAR_ENDONLY. La
diferencia entre \Z y \z es que \Z coincide antes de una nueva lnea que es
el ltimo carcter de la cadena, adems de al final de la cadena, mientras
que \z coincide slo con el final.
La declaracin \G es verdadera slo cuando la posicin de comparacin
actual est al principio del punto de coincidencia, tal como se especifica en
el argumento offset de preg_match(). Difiere de \A cuando el valor de
offset no es cero.
Se puede usar \Q y \E para ignorar metacaracteres de expresiones
regulares. Por ejemplo: \w+\Q.$.\E$ coincidir con uno o ms caracteres
palabra, seguidos por los literales .$. y anclados al final de la cadena.
A partir de PHP 5.2.4, \K se puede usar para reiniciar el comienzo de
comparacin. Por ejemplo, el patrn foo\Kbar coincide con "foobar", pero
informa de que ha coincidido con "bar". El uso de \K no interfiere con el
parmetro de las cadenas capturadas. Por ejemplo, cuando el patrn
(foo)\Kbar coincide con "foobar", la primera subcadena est establecida an
a "foo".
Propiedades de los caracteres Unicode
A partir de 5.1.0, estn disponibles tres secuencias de escape adicionales
para comparar tipos de caracteres genricos cuando el modo UTF-8 est
seleccionado. Son:
\p{xx} un carcter con la propiedad xx
\P{xx} un carcter sin la propiedad xx
\X una secuencia Unicode extendida
Los nombres de las propiedades representadas arriba por xx estn limitadas
a las propiedades de la categora general de Unicode. Cada carcter tiene
exactamente una propiedad, especificada por una abreviatura de dos letras.
Por compatibilidad con Perl, la negacin se puede especificar incluyendo un
acento circunflejo entre la llave de apertura y el nombre de la propiedad.
Por ejemplo, \p{^Lu} es lo mismo que \P{Lu}.
Si slo se especifica una letra con \p o \P, se incluyen todas las propiedades
que comienzan con esa letra. En este caso, en la ausencia de negacin, las
llaves en la secuencia de escape son opcionales; estos dos ejemplos tienen
el mismo efecto:
\p{L}
\pL

Cdigos
Propied
ad
C
Cc
Cf
Cn
Co
Cs

de propiedades admitidos

Letra

Ll
Lm
Lo
Lt
Lu
M
Mc
Me
Mn
N
Nd
Nl
No
P

Letra minscula
Letra modificadora
Otra letra
Letra de ttulo
Letra mayscula
Marca
Marca de espacio
Marca de cierre
Marca de no-espacio
Nmero
Nmero decimal
Nmero letra
Otro nmero
Puntuacin
Puntuacin
de
conexin
Puntuacin guin
Puntuacin de cierre
Puntuacin final
Puntuacin inicial
Otra puntuacin
Puntuacin
de
apertura
Smbolo
Smbolo de moneda
Smbolo modificador
Smbolo matemtico
Otro smbolo
Separador

Pc
Pd
Pe
Pf
Pi
Po
Ps
S
Sc
Sk
Sm
So
Z

Coincidencias

Notas

Otro
Control
Formato
Sin asignar
Uso privado
Sustituto
Incluye las siguientes propiedades: Ll, Lm,
Lo, Lt y Lu.

Cdigos de propiedades admitidos


Propied
Coincidencias
Notas
ad
Zl
Separador de lnea
Separador
de
Zp
prrafo
Separador
de
Zs
espacio
Las propiedades extendidas tales como InMusicalSymbols no estn
admitidas por PCRE.
El especificar coincidicencias insensibles a maysculas-minsculas no
afecta a estas secuencias de escape. Por ejemplo, \p{Lu} siempre coincide
con letras maysculas.
Los conjuntos de caracteres Unicode estn definidos como pertenecientes a
ciertos alfabetos. Se puede hacer coincidir un carcter de uno de estos
conjuntos usando un nombre de alfabeto. Por ejemplo:
\p{Greek}
\P{Han}
Aquellos que no son parte de un alfabeto identificado, son metidos en el
mismo saco como Common. La lista actual de alfabetos es:
El escape \X coincide con un cluster de grafemas ampliado de Unicode. Un
clster de grafemas ampliado es uno o ms caracteres Unicode que se
combinan para formar un nico glifo. A todos los efectos, se puede pensar
en ello como el equivalente Unicode de . ya que coincidir con un carcter
compuesto, independientemente de cantos caracteres individuales se usan
en realidad para representarlo.
En versiones de PCRE anteriores a la 8.32 (las cuales se corresponden con
versiones de PHP anteriores a la 5.4.14 al usar la biblioteca PCRE incluida),
\X es equivalente a (?>\PM\pM*). Esto es, coincide con un carcter sin la
propiedad "marca", seguido de cero o ms caracteres con la propiedad
"marca", y trata la secuencia como un grupo atmico (vase ms abajo).
Los caracteres con la propiedad "marca" son normalmente acentos que
afectan al carcter predecente.
La comparacin de caracteres por propiedades Unicode no es rpida,
porque PCRE ha de buscar una estructura que contiene datos por ms de
quince mil caracteres. Es por esto por lo que las secuencias de escape
tradicionales tales como \d y \w no usan propiedades Unicode en PCRE
Anclas
Fuera de una clase carcter, en el modo de comparacin por defecto, el
carcter circunflejo (^) es una declaracin que es verdadera slo si el punto
de coincidencia actual est en el inicio de de la cadena objetivo. Dentro de

una clase carcter, circunflejo (^) tiene un significado totalmente diferente


(vase ms adelante).
Circunflejo (^) no necesita ser el primer carcter del patrn si estn
implicadas varias alternativas, pero debera ser la primera cosa en cada
alternativa en la que aparece si el patrn es comparado siempre con esa
rama. Si todas las posibles alternativas comienzan con un circunflejo (^), es
decir, si el patrn es obligado a coincidir slo con el comienzo de la cadena
objetivo, se dice que el patrn est "anclado". (Tambin hay otras
contrucciones que pueden causar que un patrn est anclado.)
Un carcter dlar ($) es una declaracin la cual es TRUE slo si el punto
actual de coincidencia est al final de la cadena objetivo, o inmediatamente
antes de un carcter de nueva lnea que es el ltimo carcter en la cadena
(por defecto). Dlar ($) no necesita ser el ltimo carcter del patrn si estn
implicadas varias alternativas, pero debera ser el ltimo elemento en
cualquier rama en la que aparezca. Dlar no tiene un significado especial en
una clase carcter.
El significado de dlar se puede cambiar, de modo que slo coincida con el
final
absoluto
de
la
cadena,
estableciendo
la
opcin
PCRE_DOLLAR_ENDONLY en tiempo de compilacin o comparacin. Esto no
afecta a la declaracin \Z.
El significado de los caracteres circunflejo y dlar se cambia si la opcin
PCRE_MULTILINE es establecida. Cuando este es el caso, conciden
inmediatemente despus e inmediatamente antes que un carcter "\n"
interno, respectivamente, adems de coincidir al principio y final de la
cadena objetivo. Por ejemplo, el patrn /^abc$/ coincide con la cadena
objetivo "def\nabc" en el modo multilnea, y no en otros.
Consecuentemente, los patrones que estn anclados en el modo de una
sla lnea, a causa del inicio de todas las ramas con "^", no estn anclados
en el modo multilnea. La opcin PCRE_DOLLAR_ENDONLY es ignorada si
PCRE_MULTILINE est establecida.
Observe que las secuencias \A, \Z, y \z se pueden usar para coincidir el
inicio y final de la cadena objetivo en ambos modos, y si todas las ramas de
un patrn comienzan con \A, el patrn siempre es anclado, sin tener en
cuenta si PCRE_MULTILINE est establecido o no.
. Punto
Fuera de una clase carcter, un punto en el patrn coincide con un carcter
en el sujeto, incluyendo un carcter no imprimible, pero no (por defecto)
con una nueva lnea. Si la opcin PCRE_DOTALL est establecida, entonces
los puntos coinciden con nuevas lneas tamben. El manejo del punto es
totalmente independiente del manejo de circunflejo y dlar, la nica
relacin existente es que ambos implican caracteres de nueva lnea. El
punto no tiene un significado especial en una clase carcter.

\C se puede usar para comparar un nico byte. Tiene sentido en modo UTF8 donde el punto coincide con el carcter entero, el cual puede consistir en
mltiples bytes.
Clases carcter
Un corchete de apertura inicia una clase carcter, finalizada por un corchete
de cierre. Un corchete de cierre por s solo no es especial. Si se requiere un
corchete de cierre como un miembro de la clase, ste debera ser el primer
carcter de informacin en la clase (despus de un circunflejo inicial, si est
presente) o escapado con una barra invertida.
Una clase carcter coincide con un slo carcter en el sujeto; el carcter
debe estar en el conjunto de caracteres definido por la clase, a menos que
el primer carcter en la clase sea un circunflejo, en cuyo caso el carcter
sujeto no debe de estar en el conjunto definido por la clase. Si un circunflejo
es requerido en realidad como un miembro de la clase, asegrese de que no
sea el primer carcter, o escpelo con una barra invertida.
Por ejemplo, la clase carcter [aeiou] coincide con cualquier vocal
minscula, mientras que [^aeiou] con cualquier carcter que no sea una
vocal minscula. Observe que un circunflejo es slo una notacin
conveniente para especificar los caracteres que estn en la clase
enumerando los que no estn. Si no es una declaracin: an consume un
carcter de la cadena objetivo, y falla si el punto actual est al final de la
cadena.
Cuando est establecida la coincidencia insensible a maysculas-minculas,
cualquier letra en una clase representa tanto su versin en maysculas
como minusculas, as, por ejemplo, una clase insensible [aeiou] coincidice
con "A" as como con "a", y una clase insensible [^aeiou] no coincide con
"A", mientras que una versin sensible lo hara.
El carcter nueva lnea nunca es tratado de manera especial en las clases
carcter, sin importar el establecimiento de la opcin PCRE_DOTALL o
PCRE_MULTILINE. Una clase como [^a] siempre coincidir con una nueva
lnea.
El carcter menos (guin) se puede usar para especificar un rango de
caracteres en una clase carcter. Por ejemplo, [d-m] coincide con cualquier
letra entre d y m, inclusive. Si un carcter - (menos) se requiere en una
clase, se debe escapar con una barra invertida o aparecer en una posicin
donde no pueda ser interpretado como indicador de rango, tpicamente
como el primer o ltimo carcter en una clase.
No es posible tener un carcter literal "]" como el carcter final de un rango.
Un patrn como [W-]46] es interpretado como una clase de dos caracteres
("W" y "-") seguido de una cadena literal "46]", por lo que coincidira con
"W46]" o "-46]". Sin embargo, si el "]" es escapado con una barra invertida
es interpretado como el final del rango, as [W-\]46] es interpretado como
un clase individual que contiene un rango seguido de dos caracteres aparte.

La representacin octal o hexadecimal de "]" tambin se puede usar al final


del rango.
Los rangos operan en la secuencia de colacin de ASCII. Tambin se pueden
usar para caracteres especificados numricamente, por ejemplo
[\000-\037]. Si un rango que incluye letras se usa cuando se establece la
coincidencia insensible a maysculas-minsculas, coincide con las letras en
cualquier caso. Por ejemplo, [W-c] es equivalente a [][\^_`wxyzabc],
comparados insensiblemente, y si las tablas de caracteres para la
configuracin regional "fr" estn siendo usadas, [\xc8-\xcb] coincide con
caracteres E acentudos en ambos casos.
Los tipos de caracteres \d, \D, \s, \S, \w, y \W tambin pueden aparecer en la
clase carcter, y aaden a la clase los caracteres que ellos representan. Por
ejemplo, [\dABCDEF] coincide con cualquier dgito hexadecimal. Un
circunflejo se puede usar convenientemente con los tipos de caracteres en
maysculas para especificar un conjunto de caracteres ms restrictivo que
el tipo de coincidencia en minscula. Por ejemplo, la clase [^\W_] coincide
con cualquier letra o dgito, excepto con el subrayado.
Todos los caracteres no alfanumricos distintos de \, -, ^ (al comienzo) y el ]
finalizador no son especiales en una clase carcter, pero no es perjudicial si
se escapan. El terminador de patrn siempre es especial y debe ser
escapado cuando se usa dentro de una expresin.
Perl soporta la notacin POSIX para clases carcter. sta usa nombres
encerrados entre [: y :] dentro de los corchetes. PCRE tambin soporta esta
notacin. Por ejemplo, [01[:alpha:]%] coincide con "0", "1", cualquier
carcter alfabtico, o "%". Los nombres de las clases soportadas son:
Clases carcter
alnum letras y dgitos
alpha
letras
ascii
cdigos de caracteres 0 - 127
blank
espacio o tabulacin solamente
cntrl
caracteres de control
digit
dgitos decimales (lo mismo que \d)
graph
caracteres imprimibles, excluyendo el espacio
lower
letras minsculas
print
caracteres imprimibles, incluyendo el espacio
punct
caracterse imprimibles, excluyendo letras y dgitos
space
escpacio en blanco (casi lo mismo que \s)
upper
letras maysculas
word
caracteres "word" (palabra) (lo mismo que \w)
xdigit
dgitos hexadecimales
Los caracteres space son HT (9), LF (10), VT (11), FF (12), CR (13), y espacio
(32). Observe que esta lista incluye el caracter VT (cdigo 11). Esto hace

que "space" sea diferente de \s, el cul no incluye VT (por compatibilidad


con Perl).
El nombre word es una extensin de Perl, y blank es una extensin de GNU
desde Perl 5.8. Otra extensin de Perl es la negacin, indicada por un
carcter ^ despus de los dos puntos. Por ejemplo, [12[:^digit:]] coincide
con "1", "2", o cualquier no-digito.
En el modo UTF-8, los caracteres con valores mayores que 128 no coinciden
con ninguna de las clases carcter POSIX. A partir de PHP 5.3.0 y libpcre
8.10 se han cambiado algunas caractersticas para utilizar propiedades de
caracteres Unicode, en cuyo caso la restriccin mencionada no se aplica.
Consulte el manual de PCRE(3) para ms detalles.
Dentro de una clase de caracteres pueden aparecer propiedades de
carcter de Unicode. No pueden ser parte de un rango. El carcter menos (-)
despus de una clase de caracteres de Unicode se comparar literalmente.
Intentar finalizar un rango con una propiedad de carcter Unicode resultar
en una advertencia
Alternancia
Los caracteres barra vertical se usan para separar patrones alternativos. Por
ejemplo, el patrn gilbert|sullivan coincide con "gilbert" o con "sullivan".
Pueden aparecer cualquier nmero de alternativas, y se permite una
alternativa vaca (coincidiendo con la cadena vaca). El proceso de
comparacin prueba cada alternativa sucesivamente, de izquierda a
derecha, y la primera que tenga xito se usa. Si las alternativas estn
dentro de un sub-patrn (definido ms adelante), "tener xito" significa
coincidir con el resto del patrn principal as como con la alternativa en el
sub-patrn.
Ajuste de opciones internas
Los
ajustes
de
PCRE_CASELESS,
PCRE_MULTILINE,
PCRE_DOTALL,
PCRE_UNGREEDY, PCRE_EXTRA, PCRE_EXTENDED y PCRE_DUPNAMES se
pueden cambiar desde dentro de un patrn por una secuencia de letras de
opciones de Perl encerradas entre "(?" y ")". Las letras de opciones son:
Letras de opciones internas
i
para PCRE_CASELESS
m
para PCRE_MULTILINE
s
para PCRE_DOTALL
x
para PCRE_EXTENDED
U
para PCRE_UNGREEDY
X
para PCRE_EXTRA
J
para PCRE_INFO_JCHANGED
Por ejemplo, (?im) establece la coincidencia insensible a maysculasminsculas, y multilnea. Tambin es posible eliminar estas opciones
precediendo la letra con un guin, y un establecimiento y eliminacin
combinados como (?im-sx), el cual establece PCRE_CASELESS y

PCRE_MULTILINE mientras que elimina PCRE_DOTALL y PCRE_EXTENDED,


tambin est permitido. Si una letra aparece tanto antes como despus del
guin, la opcin es eliminada.
Cuando un cambio de opcin sucede en el nivel superior (es decir, fuera de
sub-patrones entre parntesis), el cambio se aplica al resto del patrn que
sigue. As, /ab(?i)c/ coincide slo con "abc" y "abC".
Si un cambio de opcin sucede dentro de un sub-patrn, el efecto es
diferente. Esto es un cambio de comportamiento en Perl 5.005. Un cambio
de opcin dentro de un sub-patrn afecta slo a aquella parte del subpatrn que le sigue, por lo que (a(?i)b)c coincide con abc y aBc y ninguna
otra cadena ms (asumiendo que no se usa PCRE_CASELESS). Por medio de
esto, las opciones pueden ser producidas para tener diferentes ajustes en
diferentes partes del patrn. Cualquier cambio hecho en un alternativa
contina en ramas subsiguientes dentro del mismo sub-patrn. Por ejemplo,
(a(?i)b|c) coincide con "ab", "aB", "c", y "C", incluso cuando al coincidir con
"C" la primera rama es abandonada despus de establecer la opcin. Esto
es porque los efectos del establecimiento de opciones ocurren en tiempo de
compilacin. De otro modo habra algunos comportamiento extraos.
Las opciones especficas de PCRE PCRE_UNGREEDY y PCRE_EXTRA se
pueden cambiar de la misma forma que las opciones compatibles con Perl
usando los caracteres U y X respectivamente. La bandera de ajuste (?X) es
especial ya que debe producirse siempre antes de que se active cualquier
otra caracterstica en el patrn, incluso si est en el nivel superior. Lo mejor
es ponerlo al principio.
Sub-patrones
Los sub-patrones estn delimitados por parntesis, los cuales pueden estar
anidados. Marcar parte de un patrn como un sub-patrn hace dos cosas:
Localiza un conjunto de alternativas. Por ejemplo, el patrn cata(rata|pulta|)
coincide con una de las palabras "cata", "catarata", o "catapulta". Sin los
parntesis, coincidira con "catarata", "pulta" o la cadena vaca.
Establece el sub-patrn como un sub-patrn de captura (como se defini
antes). Cuando el patrn completo coincide, esa porcin de la cadena
objetivo que coincidi con el sub-patrn es devuelta la llamador mediante el
argumento ovector de pcre_exec(). Los parntesis de apertura se cuentan
de izquierda a derecha (comenzando por 1) para obtener el nmero de los
sub-patrones de captura.
Por ejemplo, si la cadena "el rojo amanecer" se compara con el patrn el
((rojo|oscuro) (amanecer|atarceder)) las cadenas capturadas son "rojo
amanecer", "rojo", y "amanecer", y son numeradas como 1, 2, y 3.
El hecho de que los simples parntesis lleven a cabo dos funciones no es
siempre til. Con frecuencia se presenta el caso en el que un sub-patrn de
agrupamiento se requiere sin la necesidad de una captura. Si un parntesis
de apertura es seguido por "?:", el sub-patrn no realiza ninguna captura, y
no es contado cuando se computa el nmero de cualquier sub-patrn de

captura subsiguiente. Por ejemplo, si la cadena "el oscuro atardecer" se


compara con el patrn the ((?:rojo|oscuro) (amanecer|atarceder)) las
subcadenas capturadas son "oscuro atardecer" y "atarceder", y son
numeradas como 1 y 2. El nmero mximo de subcadenas capturadas es de
65535. Sin embargo, podra no ser posible compilar patrones tan grandes,
dependiendo de las opciones de configuracin de libpcre.
Como abreviacin conveniente, si se necesita cualquier establecimiento de
opciones al inicio de un sub-patrn que no sea de captura, las letras de
opciones pueden aparecen entre el "?" y ":". As lo dos patrones
(?i(?i:lunes|martes)
(?:(?i)lunes|martes)
coinciden exactamente con el mismo conjunto de cadenas. Dado que las
ramas alternativas son probadas de izquierda a derecha, y las opciones no
se reinician hasta que se alcance el final del sub-patrn, el establecimiento
de una opcin en una rama afecta a las ramas siguientes, por lo que los
patrones de arriba coinciden tanto con "MARTES" como con "Lunes".
Es posible nombrar un sub-patrn usando la sintaxis (?P<nombre>patrn).
Este sub-patrn ser entonces indexado en el array de coincidencias
mediante su posicin numrica normal y mediante su nombre tambin. PHP
5.2.2
introdujo
dos
sintaxis
alternativas
(?<nombre>patrn)
y
(?'nombre'patrn).
A veces es necesario tener mltiples coincidencias, pero alternando
subgrupos en una expresin regular. Normalmente, a cada subgrupo se le
asignara su propio nmero de retroreferencia incluso si slo uno de ellos
coincidiera. Para superar esto, la sintaxis (?| permite tener nmeros
duplicados. Considere la siguiente expresin regular comparada con la
cadena Sunday:
(?:(Sat)ur|(Sun))day
Aqu Sun se guarda en la retroreferencia 2, mientras que la retroreferencia 1
est vaca. La comparacin cede Sat a la retroreferncia 1 mientras que la
retroreferncia 2 no existe. Cambiar el patrn para usar (?| corrige este
problema:
(?|(Sat)ur|(Sun))day
Al usar este patrn, tanto Sun como Sat seran almacenados en la
retroreferencia 1.
Repeticin
La repeticin se especifica mediante cuantificadores, los cuales pueden ir
detrs de cualquiera de los siguientes elementos:
un nico carcter, posiblemente escapado
el metacarcter . (punto)
una clase carcter
una retroreferencia (vase la siguiente seccin)
un sub-patrn entre parntesis (a menos que haya una declaracin - vase
ms adelante)

El cuantificador de repeticin general especifca un mnimo y un mximo del


nmero de coincidencias pertmitidas, dndose los dos nmeros entre llaves,
separados por una coma. Los nmeros deben ser menores que 65536, y el
primero debe ser menor o igual que el segundo. Por ejemplo: z{2,4}
coincide con "zz", "zzz", o "zzzz". Una llave de cierre por s misma no es un
carcter especial. Si se omite el segundo nmero, pero la coma est
presente, no hay lmite superior; si el segundo nmero y la coma se omiten,
el cuantificador especifica un nmero exacto de coincidencias requeridas.
As [aeiou]{3,} coincide al menos con 3 vocales sucesivas, pero puede
coincidir con muchas ms, mientras que \d{8} coincide exactamente con 8
dgitos. Una llave que aparezca en una posicin donde no se permite un
cuantificador, o una que no coincida con la sintaxis de un cuantificador, se
toma como un carcter literal. Por ejemplo, {,6} no es un cuantificador, sino
una cadena literal de cuatro caracteres.
El cuantificador {0} est permitido, lo que provoca que la expresin se
comporte como si el elemento anterior y el cuantificador no estuvieran
presentes.
Por conveniencia (y compatibilidad histrica) los tres cuantificadores ms
comunes tiene como abreviatura un carcter simple:
Cuantificadores de carcter simple
*
equivale a {0,}
+
equivale a {1,}
?
equivale a {0,1}
Es posible construir bucles infinitos mediante un sub-patrn que pueda no
coincidir con caracteres, seguido de un cuantificador que no tenga lmite
superior, por ejemplo: (a?)*
Versiones anteriores de Perl y PCRE solan dar un error en tiempo de
ejecucin para tales patrones. Sin embargo, ya que hay casos donde esto
puede ser til, tales patrones se aceptan ahora, pero si cualquier repeticin
de un sub-patrn de hecho no coincide con caracteres, el bucle se abandona
a la fuerza.
Por defecto, los cuantificadores son "codiciosos", es decir, comparan todo lo
posible (hasta el nmero mximo de veces permitido), sin provocar que el
resto del patrn falle. El ejemplo clsico de cmo esto da problemas es al
intentar coincidir comentarios de programas en C. stos aparecen entre las
secuencias /* y */ y dentro de la secuencia, pueden aparecer caracteres * y /
individuales. Un intento de coincidir comentarios en C aplicando el patrn
/\*.*\*/ a la cadena /* primer comentario */ no comentado /* segundo
comentario */ falla, ya que coincide con la cadena completa debido a que el
elemento .* es codicioso.
Sin embargo, si un cuantificador es seguido por un signo de interrogacin,
entonces se convierte en perezoso, coincidiendo el mnimo nmero de
veces posible, as el patrn /\*.*?\*/ funciona de forma correcta con los

comentarios en C. Por lo dems, el significado de los diferentes


cuantificadores no vara, slo el nmero de coincidencias preferidas. No
confunda este uso del signo de interrogacin con su uso como un
cuantificador por derecho propio. Ya que tiene dos usos, puede aparecer a
veces doble, como en \d??\d que coincide con un dgito preferentemente,
pero puede coincidir con dos si esa es la nica manera de que el resto del
patrn coincida.
Si la opcin PCRE_UNGREEDY se establece (una opcin que no est
disponible en Perl), los cuantificadores no son codiciosos por defecto, pero
puede hecrselos codiciosos si les sigue un signo de interrogacin. En otras
palabras, invierte el comportamiento por defecto.
Los cuantificadores seguidos de + son "posesivos". Consumen tantos
caracteres como les es posible y no retornan para coincidir con el resto del
patrn. As, .*abc coincide con "aabc" pero .*+abc no, ya que .*+ consume
la cadena entera. Se pueden usar los cuantificadores posesivos para
acelerar el procesamiento.
Cuando un sub-patrn entre parntesis es cuantificado con un mnimo de
cuenta de repeticiones que es mayor que 1 o con un mximo limitado, se
necesita ms capacidad de almacenamiento para el patrn compilado, en
proporcin al tamao del mnimo o mximo.
Si un patrn comienza con .* o .{0,} y la opcin PCRE_DOTALL (equivalente
a la de Perl /s) est establecida, as permitiendo al . (punto) coincidir con
nuevas lneas, entonces el patrn est implcitamente anclado, ya que
cualquier cosa que haya a continuacin se seguir intentando comparar con
cada posicin de carcter en la cadena objetivo, por lo que no sirve de nada
volver a intentar la comparacin completa desde cualquier posicin despus
de la primera. PCRE trata estos patrones como si estuvieran precedidos
por \A. En los casos donde se sabe que la cadena objetivo no contiene
nuevas lneas, vale la pena establecer PCRE_DOTALL cuando el patrn
comienza con .* para obtener esta optimizacin, o alternativamente, usar ^
para indicar explcitamente el anclado.
Cuando se repite un sub-patrn de captura, el valor capturado es la
subcadena que coincide con la iteracin final. Por ejemplo, despus de que
(tweedle[dume]{3}\s*)+ se haya comparado con "tweedledum tweedledee"
el valor del sub-patrn de captura es "tweedledee". Sin embargo, si hay
sub-patrones de captura anidados, los valores capturados correspondientes
pueden haber sido establecidos en iteraciones previas. Por ejemplo,
despus de que /(a|(b))+/ se compare con "aba", el valor del segundo subpatrn de captura es "b".
Retroreferencias
Fuera de una clase carcter, una barra invertida seguida por un dgito
mayor que 0 (y posiblemente ms dgitos) es una retroreferencia a un subpatrn de captura anterior (esto es a su izquierda) del patrn, siempre que
hayan habido tantas capturas entre parntesis previas a la izquierda.

Sin embargo, si el nmero decimal que sigue a la barra invertida es menor


que 10, siempre es tomado como una retroreferencia, y produce un error
slo si no hay tantas capturas anteriores entre parntesis en el patrn
completo. En otras palabras, los parntesis que son referenciados no
necesitan estar a la izquierda de la referencia para nmeros menores que
10. Una "retroreferencia hacia adelante" puede tener sentido cuando est
involucrada una repeticin y el sub-patrn de la derecha ha participado en
una iteracin anterior. Vase la seccin anterior titulada "Barra invertida"
para ms detalles acerca del manejo de los dgitos que siguen a una barra
invertida.
Una retroreferencia coincide con cualquier cosa que en realidad haya
coincidido con el sub-patrn de captura en la cadena objetivo actual, ms
que con cualquier cosa que coincida en el sub-patrn mismo. As, el patrn
(abraz|apreci)o de un \1ador coindice con "abrazo de un abrazador" y con
"aprecio de un apreciador", pero no con "abrazo de un apreciador". Si la
coincidencia sensible a maysculas-minsculas est en vigor en el
momento de la retroreferencia, la distincin de letras es relevante. Por
ejemplo, ((?i)bla)\s+\1 coincide con "bla bla" y "BLA BLA", pero no con "BLA
bla", incluso si el patrn de captura original es comparado de forma
insensible a maysculas-minsculas.
Puede haber ms de una retroreferencia hacia el mismo sub-patrn. Si un
sub-patrn no ha sido usado en realidad en una coincidencia en particular,
cualquier retroreferencia a l siempre falla. Por ejemplo, el patrn (a|(bc))\2
siempre falla si comienza coincidiendo con "a" en vez de con "bc". Ya que
puede haber hasta 99 retroreferencias, todos los dgitos que siguen a la
barra invertida se toman como parte de un nmero posible de
retroreferencias. Si el patrn contina con un carcter dgito, entonces se
deben usar algunos delimitadores para finalizar la retroreferencia. Si la
opcin PCRE_EXTENDED est establecida, ste puede ser un espacio en
blanco. De otra manera se puede usar un comentario vaco.
Una retroreferencia que sucede dentro de los parntesis a los cuales se
refiere, falla cuando el sub-patrn se usa primero, as, por ejemplo, (a\1)
nunca coincide. Sin embargo, tales referencias pueden ser tiles dentro de
sub-patrones repetidos. Por ejemplo, el patrn (a|b\1)+ coincide con
cualquier nmero de "a"es y tamben con "aba", "ababba", etc. En cada
iteracin del subpatrn, la retroreferencia coincide con el cadena
correspondiente a la iteracin anterior. Para que esto funcione, el patrn
debe ser tal que la primera iteracin no necesite coincidir con la
retroreferencia. Esto se puede lograr usando alternancia, como en el
ejemplo anterior, o mediante un cuantificador con un mnimo de cero.
A partir de PHP 5.2.2, la secuencia de escape \g se puede usar para
referenciar subpatrones de forma absoluta y relativa. Esta secuencia de
escape debe estar seguida por un nmero sin signo o un nmero negativo,
opcionalmente encerrado entre llaves. Las secuencias \1, \g1 y \g{1} son

sinnimas unas de otras. El uso de este patrn con un nmero sin signo
puede ayudar a eliminar la ambigedad inherente al usar dgitos seguidos
de una barra invertida. La secuencia ayuda a distinguir retroreferencias de
caracteres octales y tambin hace ms fcil tener una retroreferencia
seguida por un nmero literal, p.ej. \g{2}1.
El uso de la secuencia \g con un nmero negativo significa una referencia
relativa. Por ejemplo, (foo)(bar)\g{-1} coincidira con la secuencia
"foobarbar" y (foo)(bar)\g{-2} coincidira con "foobarfoo". Esto puede ser
til en patrones largos como una alternativa de seguir la pista del nmero
de subpatrones para referenciar un subpatrn previo especfico.
Las retroreferencias a sub-patrones nominados se pueden lograr mediante
(?P=nombre) o, desde PHP 5.2.2, tambin mediante \k<nombre> o
\k'nombre'. Adems, PHP 5.2.4 aadi soporte para \k{nombre} y
\g{nombre}, y PHP 5.2.7 para \g<name> y \g'name'.
Declaraciones
Una declaracin es una comprobacin de los caracteres siguientes o
anteriores al punto de coincidencia actual que en realidad no consumen
carcter alguno. Las declaraciones simples codificadas como \b, \B, \A, \Z,
\z, ^ y $ estn descritas en secuencias de escape. Las declaraciones ms
complicadas estn codificadas como sub-patrones. Hay dos tipos: aqullas
que buscan hacia delante desde punto actual de la cadena objetivo, y
aqullas que buscan hacia atrs desde l.
Un patrn declaracin es comparado de la forma habitual, excepto que no
causa que la posicin actual de coincidencia cambie. Las declaraciones de
bsqueda hacia delante comienzan con (?= para declaraciones positivas y
con (?! para declaraciones negativas. Por ejemplo, \w+(?=;) coincide con
una palabra seguida de un punto y coma, pero no incluye el punto y coma
en la coincidencia, y foo(?!bar) coincide con cualquier incidencia de "foo"
que no est seguida de "bar". Observe que el patrn aparentemente similar
(?!foo)bar no encuentra una incidencia de "bar" que est precedida por algo
distinto de "foo"; no encuentra ninguna incidencia de "bar" en absoluto, ya
que la declaracin (?!foo) es siempre TRUE cuando los tres caracteres
siguientes son "bar". Se necesita una declaracin de bsqueda hacia atrs
para conseguir este efecto.
Las declaraciones de bsqueda hacia atrs comienzan con (?<= para
declaraciones positivas y con (?<! para declaraciones negativas. Por
ejemplo, (?<!foo)bar encuentra una incidencia de "bar" que no est
precedida por "foo". El contenido de una declaracin de bsqueda hacia
atrs est restringido de tal manera que todas las cadenas que se
comparen con ella deben tener una longitud fija. Sin embargo, si hay varias
alternativas, no es necesario que tengan todas la misma longitud fija. As, (?
<=buey|burro) est permitido, pero (?<!toros?|vacas?) produce un error en
tiempo de compilacin. Las ramas que se comparan con cadenas de
diferente longitud estn permitidas slo en el nivel superior de una

declaracin de bsqueda hacia atrs. Esto es una extensin comparado con


Perl 5.005, la cual requiere que todas las ramas a comparar tengan la
misma longitud de cadena. Una declaracin como (?<=ab(c|de)) no est
permitida porque su rama del nivel superior puede coincidir con dos
longitudes diferentes, pero es aceptable si se reescribe para usar dos ramas
del nivel superior: (?<=abc|abde) La implementacin de las declaraciones
de bsqueda hacia atrs es, para cada alternativa, retroceder
temporalmente la posicin actual por el ancho fijo y despus intentar
coincidir. Si no hay suficientes caracteres antes de la posicin actual, la
comparacin est condenada a fallar. Las declaraciones de bsqueda hacia
atrs junto con los sub-patrones de una sla aplicacin pueden ser
particularmente tiles para comparaciones con los finales de las cadenas;
se da un ejemplo al final de la seccin de sub-patrones de una sla
aplicacin.
Varias declaraciones (de cualquier tipo) pueden producirse en sucecin. Por
ejemplo, (?<=\d{3})(?<!999)foo coincide con "foo" precedido de tres
dgitos que no sean "999". Ntese que cada una de las declaraciones es
aplicada en el mismo punto de la cadena objetivo. Primero, se verifica que
los tres caracteres previos son todos dgitos, depus se verifica que esos
mismos tres caracteres no sean "999". Este patrn no coincide con "foo"
precedido de seis caracteres, los primeros de los cuales son dgitos y los
tres ltimos de llos no son "999". Por ejemplo, no coincide con
"123abcfoo". Un patrn que hace eso es (?<=\d{3}...)(?<!999)foo
Esta vez, la primera declaracin examina los seis caracteres precedentes,
verificando que los tres primeros son dgitos, y despus, la segunda
declaracin verifica que los tres caracteres anteriores no son "999".
Las declaraciones pueden estar anidadas en cualquier combiancin. Por
ejemplo, (?<=(?<!foo)bar)baz coincide con una incidencia de "baz" que
est precedida por "bar", la cual a su vez no est precedida por "foo",
mientras que (?<=\d{3}...(?<!999))foo es otro patrn que coincide con
"foo" precedido por tres dgitos y otros tres caracteres cualesquiera que no
sean "999".
Los sub-patrones declarativos no son sub-patrones de captura, y no se
pueden repetir, ya que no tiene sentido declarar la misma cosa varias
veces. Si cualquier tipo de declaracin contiene sub-patrones de captura
dentro de ella, stos son contados con el propsito de numerar los subpatrones de captura en el patrn completo. Sin embargo, la captura de
subcadenas se realiza slo para declaraciones positivas, ya que no tiene
sentido para declaraciones negativas.
Las declaraciones cuentan para el mximo de 200 sub-patrones entre
parntesis.
Sub-patrones de una sla aplicacin
Con las repeticiones maximizadoras y minimizadoras, el fallo de lo que se
encuentra a continuacin causa normalmente que la repeticin del

elemento sea re-evaluada para ver si un nmero diferente de repeticiones


permite que el resto del patrn coincida. A veces es til prevenir esto, tanto
para cambiar la naturaleza de la comparacin, como para ocasionar que
falle antes (ya que de otra manera ocurrira el fallo despus) cuando el
autor del patrn sabe que no tiene sentido seguir.
Considere, por ejemplo, el patrn \d+foo cuando se aplica a la lnea objetivo
123456bar
Despus de coincidir los 6 dgitos y luego fallar al coincidir con "foo", la
accin habitual del comparador es volver a intentarlo con slo 5 dgitos,
coincidiendo con el elemento \d+, y despus con 4, y as sucesivamente,
antes de que, por ltimo, falle. Los sub-patrones de una sla aplicacin
proporcionan el medio para especificar que una vez que una porcin del
patrn ha coincidido, no ser re-evaluado de esta forma, por lo que el
comparador se rendir inmediatamente al fallar la comparacin de "foo" la
primera vez. La notacin es otro tipo de parntesis especiales, comenzando
con (?> como en este ejemplo: (?>\d+)bar
Este tipo de parntesis "bloquea" la parte del patrn que lo contiene una
vez haya coincidido, y un fallo dentro del patrn evita que ste retroceda
sobre s mismo. El retroceso hacia elementos previos al sub-patrn funciona
normalmente, despus de todo.
Una descripcin alternativa es que un sub-patrn de este tipo coincide con
la cadena de caracteres que coincidira con un patrn idntico
independiente, si est anclado en el punto actual de la cadena objetivo.
Los sub-patrones de una sla aplicacin no son sub-patrones de captura.
Los casos sencillos como el anterior se pueden tomar como una repeticin
maximizadora que debe tragar todo lo que pueda. As, mientras que \d+
y \d+? estn preparados para adaptarse al nmero de dgitos que comparan
para hacer que el resto del patrn coincida, (?>\d+) slo puede conincidir
una secuencia completa de dgitos.
Esta construccin puede, por supuesto, contener arbitrariamente subpatrones complicados, y pueden estar anidados.
Los sub-patrones de una sla aplicacin se pueden usar junto con
declaraciones de bsqueda hacia atrs para especificar una comparacin
eficiente al final de la cadena objetivo. Considere un simple patrn como
abcd$ cuando se aplica a una cadena larga la cual no coincide. Ya que la
comparacin se lleva a cabo de izquierda a derecha, PCRE buscar cada "a"
en el sujeto y despus mirar si lo siguiente coincide con el resto del patrn.
Si el patrn se especifica as ^.*abcd$ el .* inicial coincide con la cadena
entera primero, pero cuando esto falla (debido a que no hay una "a"
siguiente), retrocede para comparar todos los caracteres excepto el ltimo,
despus todos excepto los dos ltimos, y as sucesivamente. Una vez ms la
bsqueda de "a" cubre la cadena entera, de derecha a izquierda, por lo que
no estamos en mejores circunstancias. Sin embargo, si el patrn se escribe
as ^(?>.*)(?<=abcd) entonces no puede haber retroceso para el

elemento .* ; slo puede coincidir con la cadena entera. La subsiguiente


declaracin de bsqueda hacia atrs realiza una nica comprobacin sobre
los ltimos cuatro caracteres. Si falla, la comparacin falla inmediatamente.
Para cadenas largas, este enfoque produce una diferencia significativa en el
tiempo de procesamiento.
Cuando un patrn contiene una repeticin ilimitada dentro de un sub-patrn
que puede repetirse un nmero ilimitado de veces, el uso de un sub-patrn
de una sla aplicacin es la nica manera de evitar que algunas
comparaciones fallidas tomen mucho tiempo. El patrn (\D+|<\d+>)*[!?]
compara un nmero ilimitado de subcadenas que consisten en algo que no
sea un dgito, o dgitos encerrados entre <>, seguido de ! o ?. Cuando
coincide, se ejecuta rpidamente. Sin embargo, si se aplica a
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa toma mucho
tiempo antes de informar del fallo. Esto es porque la cadena puede ser
dividida entre las dos repeticiones de muchas maneras, y todo tiene que ser
probado. (En el ejemplo se us [!?] en vez de un carcter nico al final, ya
que PCRE y Perl estn optimizados de forma que permiten que se falle
rpidamente cuando se usa un carcter nico. Ambos recuerdan el ltimo
carcter nico que se requiere para una coincidencia, y falla antes si no
est presente en la cadena.) Si el patrn se cambia a ((?>\D+)|<\d+>)*[!?]
las secuencias de los "no-dgitos" no pueden romperse, y el fallo ocurre
rpidamente.
Sub-patrones condicionales
Es posible hacer que el proceso de comparacin obedezca a un sub-patrn
condicionalmente o que elija entre dos sub-patrones alternativos,
dependiendo del resultado de una declaracin o de si un sub-patrn de
captura previo coincidi o no. Las dos formas posibles de un sub-patrn
condicional son
(?(condicin)patrn-s)
(?(condicin)patrn-s|patrn-no)
Si la condicin es satisfecha, se usa el patrn-s; de otro modo se usa el
patrn-no (si est presente). Si hay ms de dos alternativas en el subpatrn, se producir un error en tiempo de compilacin.
Hay dos tipos de condiciones. Si el texto entre los parntesis consisite en
una secuencia de dgitos, la condicin es satisfecha si el sub-patrn de
captura de ese nmero ha coincidido anteriormente. Considere el siguiente
patrn, el cual contiene espacios en blanco no significativos para hacerlo
ms legible (se asume la opcin PCRE_EXTENDED) y para dividirlo en tres
partes para facilitar su anlisis:
( \( )? [^()]+ (?(1) \) )
La primera parte compara un parntesis de apertura opcional, y si el
carcter est presente, lo establece como la primera subcadena capturada.
La segunda parte compara uno o ms caracteres que no sean parntesis. La
tercera parte es un patrn condicional que examina el primer conjunto de

parntesis coincididos o no. Si lo fueron, es decir, si el sujeto comenz con


un parntesis de apertura, la condicin es TRUE, y as el patrn-s se ejecuta
y es requerido un parntesis de cierre. De otra manera, ya que el patrn-no
no est presente, el subpatrn no coincidir con nada. En otras palabras,
este patrn coincide con una secuencia que no tenga parntesis,
opcionalmente encerrada entre parntesis.
Si la condicin es la cadena (R), se satisface si ha sido hecha una llamada
recursiva al patrn o sub-patrn. En el "nivel superior", la condicin es falsa.
Si la condicin no es una secuencia de dgitos o (R), debe de ser una
declaracin. sta puede ser una declaracin de bsqueda hacia delante o
hacia atrs, negativa o positiva. Considere este patrn, conteniendo de
nuevo espacios en blanco no significativos, y con dos alternativas en la
segunda lnea:
(?(?=[^a-z]*[a-z])
\d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} )
La condicin es una declaracin de bsqueda 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 patrn coincide
con cadenas en una de las dos formas dd-aaa-dd o dd-dd-dd, donde aaa son
letras y dd son dgitos.
Comentarios
La secuencia (?# marca el inicio de un comentario que contina hasta el
siguiente parntesis de cierre. Los parntesis anidados no estn permitidos.
Los caracteres que componen un comentario no toman parte a la hora de
una comparacin del patrn.
Si la opcin PCRE_EXTENDED est establecida, un carcter # sin escapar
fuera de una clase carcter inicia un comentario que contina hasta el
siguiente carcter de nueva lnea del patrn.
Patrones recursivos
Considere el problema de comparar una cadena entre parntesis,
permitiendo parntesis anidados ilimitados. Sin el uso de la recursividad, lo
mejor que se puede hacer es usar un patrn que compare hasta alguna
profundidad fija de anidamiento. No es posible manejar una profundidad de
anidamiento arbitraria. Perl 5.6 ha proporcionado una herramienta
experimental que permite a las expresiones regulares actuar
recursivamente (entre otras cosas). El elemento especial (?R) es
proporcionado para el caso especfico de la recursividad. Este patrn de
PCRE soluciona el problema de los parntesis (se asume que la opcin
PCRE_EXTENDED est establecida por lo que los espacios en blanco se
ignoran): \( ( (?>[^()]+) | (?R) )* \)
Primero se compara un parntesis de apertura. Despus compara cualquier
nmero de subcadenas que pueden ser tanto una secuencia de algo que no

sean parntesis como una comparacin recursiva del patrn mismo (esto
es, una subcadena con los parntesis correctos). Finalmente hay un
parntesis de cierre.
Este patrn de ejemplo en particular contiene repeticiones anidadas
ilimitadas, y as, el uso de un sub-patrn de una sla aplicacin para
comparar cadenas que no contengan parntesis es importante cuando se
aplica el patrn a cadenas que no coinciden. Por ejemplo, cuando se aplica
a
(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()
produce "no hay conicidencias" rpidamente. Sin embargo, si no se usa un
sub-patrn de una sla aplicacin, la comparacin se ejecuta realmente
durante mucho tiempo ya que hay muchas maneras diferentes de que las
repeticiones + y * se puedan repartir el sujeto, y todas tienen que ser
comprobadas antes de que se informe del fallo.
El conjunto de valores para cualquier sub-patrn de captura son aquellos del
nivel ltimo de la recursin en el cual el valor del sub-patrn es establecido.
Si el patrn anterior se compara con (ab(cd)ef) el valor del parntesis de
captura es "ef", el cual es el ltimo valor tomado en el nivel superior. Si se
aaden parntesis adicionales, dando lugar a \( ( ( (?>[^()]+) | (?R) )* ) \)
entonces la cadena que capturan es "ab(cd)ef", el contenido de los
parntesis del nivel superior. Si hay ms de 15 parntesis de captura en un
patrn, PCRE ha de obtener memoria extra para almacenar la informacin
durante una recursin, lo cual hace usando pcre_malloc, liberndola
mediante pcre_free despus. Si no se puede obtener memoria, se guarda la
informacin para los primeros 15 parntesis de captura slamente, ya que
no hay manera de otorgar un error "out-of-memory" desde dentro de una
recursin.
Se puede usar tambin (?1), (?2) y as sucesivamente, para los sub-patrones
recursivos. Tamin es posible usar sub-patrones nominados: (?P>nombre) o
(?&nombre).
Si la sintaxis para la referencia de un sub-patrn recursivo (tanto como
nmero o como nombre) se usa fuera de los parntesis a los que hace
referencia, opera como una sub-rutina de un lenguaje de programacin. Un
ejemplo mostrado anteriormente, tal que el patrn (abraz|apreci)o de un \
1ador coincide con "abrazo de un abrazador" y con "aprecio de un
apreciador", pero no con "abrazo de un apreciador". Si en su lugar se usa
(abraz|apreci)o de un (?1)ador, coincide con "abrazo de un apreciador" as
como con las otras dos cadenas. Tales referencias deben, sin embargo,
seguir al sub-patrn al que hacen referencia.
La longitud mxima de una cadena objetivo es el nmero positivo ms
grande que una variable tipo integer pueda tener. Sin embargo, PCRE usa la
recursividad para tratar sub-patrones y repeticin indefinida. Esto significa
que el espacio de pila disponible puede limitar el tamao de una cadena
objetivo que puede ser procesada por ciertos patrones.
Rendimiento

Ciertos elementos que pueden aparecer en patrones son ms eficientes que


otros. Es ms eficiente usar una clase carcter como [aeiou] en vez de un
conjunto de alternativas como (a|e|i|o|u). En general, la construccin ms
simple que proporciona el comportamiento requerido es normalmente la
ms eficiente. El libro de Jeffrey Friedl contiene muchas discusiones sobre la
optimizacin de expresiones regulares para un rendimiento eficiente.
Cuando un patrn comienza con .* y la opcin PCRE_DOTALL est
establecida, el patrn es anclado implcitamente por PCRE, ya que slo
puede coincidir con el inicio de una cadena objetivo. Sin embargo, si
PCRE_DOTALL no est establecido, PCRE no puede realizar esta
optimizacin, ya que el metacarcter . no coincide entonces con una nueva
lnea, y si la cadena objetivo contine nuevas lneas, el patrn puede
coincidir con el carcter inmediatemente siguiente a ellas en vez de con el
inicio absoluto. Por ejemplo, el patrn (.*) segundo coincide con el sujeto
"primero\ny segundo" (donde \n significa un carcter de nueva lnea),
siendo "y" la primera subcadena capturada. Para llevar a cabo esto, PCRE
ha de re-intentar la comparacin comenzando despus de cada nueva lnea
del sujeto.
Si est usando un patrn similar con cadenas objetivo que no contienen
nuevas lneas, el mejor rendimiento se obtiene estableciendo PCRE_DOTALL,
o comenzando el patrn con ^.* para indicar el anclado explcito. Esto salva
a PCRE de tener que escanear el sujeto buscando una nueva lnea desde
donde reiniciar.
Tenga cuidado con los patrones que contienen repeticiones anidadas
indefinidas. stos pueden tomar mucho tiempo al ejecutarse cuando se
aplican a cadenas que no coinciden. Considere el fragmento de patrn
(a+)*
Esto puede coincidir con "aaaa" de 33 maneras diferentes, y este nmero se
incrementa muy rpidamente mientras la cadena se hace ms larga. (La
repeticin * puede coincidir 0, 1, 2, 3, o 4 veces, y para cada uno de estos
casos distintos de 0, las repeticiones de + pueden coincidir diferente
nmero de veces.) Cuando el resto del patrn es tal que la comparacin
completa falla, PCRE tiene como principio el intentar cada posible variacin,
y esto puede tomar un tiempo extremadamente largo.
Una optimizacin toma algunos de los casos ms simples como (a+)*b
donde sigue un carcter literal. Antes de emprender el procedimiento de
comparacin estndar, PCRE verifica que hay una "b" posterior en la cadena
objetivo, y si no la hay, falla la comparacin inmediatamente. Sin embargo,
cuando no hay un literal siguiente, no se puede usar esta optimizacin.
Puede ver la diferencia comparando el comportamiento de (a+)*\d con el
patrn anterior. El primero otorga un fallo casi instantneamente cuando se
aplica a una lnea llena de caracteres "a", mientras que el segundo toma un
tiempo apreciable con cadenas con ms de de 20 caracteres.