Expresiones regulares (C++)

La biblioteca estándar de C++ admite varias gramáticas de expresiones regulares. Este tema describe las variaciones gramaticales disponibles al usar expresiones regulares.

Gramática de expresiones regulares

La gramática de expresiones regulares que se va a usar se especifica mediante el uso de uno de los valores de enumeración std::regex_constants::syntax_option_type. Estas gramáticas de expresiones regulares se definen en std::regex_constants:

  • ECMAScript: es lo más cercano a la gramática usada por JavaScript y los lenguajes .NET.
  • basic: las expresiones regulares basic POSIX o BRE.
  • extended: las expresiones regulares extended POSIX o ERE.
  • awk: es extended, pero tiene más escapes para caracteres que no son de impresión.
  • grep: es basic, pero también permite que los caracteres de nueva línea (\n) separen las alternancias.
  • egrep: es extended, pero también permite que los caracteres de nueva línea separen las alternancias.

De forma predeterminada, si no se especifica ninguna gramática, se asume ECMAScript. Sólo se puede especificar una gramática.

También se pueden aplicar varias marcas:

  • icase: no distingue entre mayúsculas y minúsculas si se produce una coincidencia de patrones.
  • nosubs: omite las coincidencias marcadas (es decir, expresiones entre paréntesis); no se almacenan las sustituciones.
  • optimize: hace que la coincidencia sea más rápida a costa de un mayor tiempo de construcción.
  • collate: use secuencias de intercalación sensibles a la configuración regional (por ejemplo, intervalos del formulario [a-z]).

Se pueden combinar cero o más marcas con la gramática para especificar el comportamiento del motor de expresiones regulares. Si solo se especifican marcas, se supone que la gramática es ECMAScript.

Elemento

Un elemento puede ser uno de lo siguiente:

  • Un carácter ordinario que coincide con el mismo carácter en la secuencia de destino.

  • Un carácter comodín'.' que coincide con cualquier carácter de la secuencia de destino excepto una nueva línea.

  • Una expresión entre corchetes con la forma [expr], que coincide con un carácter o con un elemento de intercalación en la secuencia de destino que se encuentra también en el conjunto definido por la expresión expr o con la forma [^expr], que coincide con un carácter o un elemento de intercalación de la secuencia de destino que no está en el conjunto definido por la expresión expr.

    La expresión expr puede contener cualquier combinación de las siguientes:

    • Un carácter individual. Agrega el carácter al conjunto definido por expr.

    • Un intervalo de caracteres con la forma ch1-ch2. Agrega los caracteres representados por los valores del intervalo cerrado [ch1, ch2] al conjunto definido por expr.

    • Una clase de carácter con la forma [:name:]. Agrega los caracteres de la clase con nombre al conjunto definido por expr.

    • Una clase de equivalencia con la forma [=elt=]. Agrega los elementos de intercalación que son equivalentes a elt al conjunto definido por expr.

    • Un símbolo de intercalación con la forma [.elt.]. Agrega el elemento de intercalación elt al conjunto definido por expr.

  • Un delimitador. El anclaje ^ coincide con el inicio de la secuencia de destino. El anclaje $ coincide con el final de la secuencia de destino.

Un grupo de capturas de la forma (subexpresión) o \(subexpresión\) en basic y grep, que coincide con la secuencia de caracteres de la secuencia de destino que coincide con el patrón entre los delimitadores.

  • Un carácter de escape de identidad de la forma \k, que coincide con el carácter k en la secuencia de destino.

Ejemplos:

  • a coincide con la secuencia de destino "a", pero no coincide con la secuencia de destino "B", "b" o "c".

  • . coincide con todas las secuencias de destino"a", "B", "b", y "c".

  • [b-z] coincide con las secuencias de destino "b" y "c" pero no coincide con la secuencia de destino "a" o "B".

  • [:lower:] coincide con las secuencias de destino "a", "b" y "c" pero no coincide con la secuencia de destino "B".

  • (a) coincide con la secuencia de destino "a" y asocia el grupo de captura 1 con la subsecuencia "a", pero no coincide con las secuencias de destino "B", "b" o "c".

En ECMAScript, basic y grep, un elemento también puede ser una referencia inversa con la forma \dd, donde dd representa un valor N decimal que coincide con una secuencia de caracteres de la secuencia de destino, que es igual que la secuencia de caracteres que coincide con el enésimo grupo de capturas.

Por ejemplo, (a)\1 coincide con la secuencia de destino "aa" porque el primer grupo de captura (y único) coincide con la secuencia inicial "a" y, después, el \1 coincide con la secuencia final "a".

En ECMAScript, un elemento también puede ser uno de los siguientes:

  • Un grupo de no-captura con la forma (?: subexpresión). Coincide con la secuencia de caracteres de la secuencia de destino que coincide con el patrón entre los delimitadores.

  • Una secuencia de escape de caracteres limitada con la forma \f, \n, \r, \t o \v. Estos coinciden con un avance de página, una nueva línea, un retorno de carro, una tabulación horizontal y una tabulación vertical, respectivamente, en la secuencia de destino.

  • Una aserción positiva con la forma (= subexpresión). Coincide con la secuencia de caracteres de la secuencia de destino que coincide con el patrón entre los delimitadores, pero no cambia la posición de coincidencia en la secuencia de destino.

  • Una aserción negativa con la forma (! subexpresión). Coincide con cualquier secuencia de caracteres de la secuencia de destino que no coincida con el patrón entre los delimitadores y no cambia la posición de coincidencia en la secuencia de destino.

  • Una secuencia de escape hexadecimal con la forma \xhh. Coincide con un carácter en la secuencia de destino representado por los dos dígitos hexadecimales hh.

  • Una secuencia de escape Unicode con la forma \uhhhh. Coincide con un carácter de la secuencia de destino representado por los cuatro dígitos hexadecimales hhhh.

  • Una secuencia de control de escape con la forma \ck. Coincide con el carácter de control que denomina el carácter k.

  • Una aserción de límite de palabra con la forma \b. Coincide cuando la posición actual en la secuencia de destino está inmediatamente después de un límite de palabra.

  • Una aserción de límite de palabra negativa con la forma \B. Coincide cuando la posición actual en la secuencia de destino no está inmediatamente después de un límite de palabra.

  • Un escape de caracteres dsw con la forma \d, \D, \s, \S, \w, \W. Proporciona un nombre corto para una clase de carácter.

Ejemplos:

  • (?:a) coincide con la secuencia de destino "a", pero "(?:a)\1" no es válida porque no hay ningún grupo de captura 1.

  • (=a)a coincide con la secuencia de destino "a". La aserción positiva coincide con la secuencia inicial "a" en la secuencia de destino y la "a" final de la expresión regular coincide con la secuencia inicial "a" de la secuencia de destino.

  • (!a)a no coincide con la secuencia de destino "a".

  • a\b. coincide con la secuencia de destino "a~", pero no coincide con la secuencia de destino "ab".

  • a\B. coincide con la secuencia de destino "ab", pero no coincide con la secuencia de destino "a~".

En awk, un elemento también puede ser uno de los siguientes:

  • Una secuencia de escape de caracteres con la forma \\, \a, \b, \f, \n, \r, \t o \v. Estos coinciden con una barra diagonal inversa, una alerta, un retroceso, un avance de página, una nueva línea, un retorno de carro, una tabulación horizontal y una tabulación vertical, respectivamente, en la secuencia de destino.

  • Una secuencia de escape octal con la forma \ooo. Coincide con un carácter en la secuencia de destino cuya representación es el valor representado por uno, dos o tres de los dígitos octales ooo.

Repetición

Cualquier elemento que no sea una aserción positiva, una aserción negativa o un delimitador puede ir seguido de un recuento de repetición. La forma más general de recuento de repetición adopta la forma {min,max}, o \{min,max\} en basic y grep. Un elemento al que sigue esta forma de recuento de repetición coincide al menos con las sucesivas repeticiones de min y no más que las sucesivas repeticiones de max de una secuencia que coincide con el elemento.

Por ejemplo, a{2,3} coincide con las secuencias de destino "aa" y "aaa", pero no con las secuencias de destino "a" ni "aaaa".

Un recuento de repetición también puede adoptar una de las siguientes formas:

  • {min} o \{min} en basic y grep. Equivalente a {min,min}.

  • {min} o \{min,\} en basic y grep. Equivalente a {min,unbounded}.

  • * es equivalente a {0,unbounded}.

Ejemplos:

  • a{2} coincide con las secuencias de destino "aa", pero no con la secuencia de destino "a" o la secuencia de destino "aaa".

  • a{2,} coincide con las secuencias de destino "aa", la secuencia de destino "aaa" y así sucesivamente, pero no coincide con la secuencia de destino "a".

  • a* coincide con la secuencias de destino ""la secuencia de destino "a", la secuencia de destino "aa" y así sucesivamente.

En todas las gramáticas excepto basic y grep, un recuento de repetición también puede adoptar una de las siguientes formas:

  • ? equivale a {0,1}.

  • + es equivalente a {1,unbounded}.

Ejemplos:

  • a? coincide con las secuencias de destino "" y con la secuencia de destino "a", pero no con la secuencia de destino "aa".

  • a+ coincide con las secuencias de destino "a", la secuencia de destino "aa", y así sucesivamente, pero no con la secuencia de destino "".

En ECMAScript, todas las formas de recuento de repetición pueden ir seguidas del carácter ?, que designa una repetición no expansiva.

Concatenación

Los elementos de expresión regular, con o sin recuentos de repetición, se pueden concatenar para formar expresiones regulares más largas. La expresión resultante coincide con una secuencia de destino que es una concatenación de las secuencias que coinciden con los elementos individuales.

Por ejemplo, a{2,3}b coincide con las secuencias de destino "aab" y la secuencia de destino "aaab", pero no coincide con las secuencias de destino "ab" ni "aaaab".

Alternancia

En todas las gramáticas de expresiones regulares con excepción de basic y grep, una expresión regular concatenada puede ir seguida del carácter | (canalización) y otra expresión regular concatenada. Cualquier cantidad de expresiones regulares concatenadas se pueden combinar de esta manera. La expresión resultante coincide con cualquier secuencia de destino que coincida con una o más de las expresiones regulares concatenadas.

Cuando más de una de las expresiones regulares concatenadas coincide con la secuencia de destino, ECMAScript elige como la coincidencia a la primera de las expresiones regulares concatenadas que coincide con la secuencia, que será referida como la primera coincidencia. Las otras gramáticas de expresiones regulares eligen la que logra la coincidencia más larga.

Por ejemplo, ab|cd coincide con las secuencias de destino "ab" y la secuencia de destino "cd", pero no coincide con las secuencias de destino "abd" ni "acd".

En grep y egrep, un carácter de nueva línea \n se puede usar para separar alternancias.

Subexpression

En basic y grep, una subexpresión es una concatenación. En el resto de las gramáticas de expresiones regulares, una subexpresión es una alternancia.

Resumen de la gramática

En la siguiente tabla se resumen las características que están disponibles en las diferentes gramáticas de expresiones regulares:

Elemento basic extended ECMAScript grep egrep awk
alternancia usando | + + + +
alternancia usando \n + +
delimitador + + + + + +
referencia inversa + + +
expresión entre corchetes + + + + + +
grupo de captura usando () + + + +
grupo de captura usando \(\) + +
secuencia de escape de control +
carácter de escape dsw +
escape de formato de archivo + +
secuencia de escape hexadecimal +
escape de identidad + + + + + +
aserción negativa +
aserción de límite de palabra negativa +
grupo de no-captura +
repetición no expansiva +
secuencia de escape octal +
caracteres ordinarios + + + + + +
aserción positiva +
repetición usando {} + + + +
repetición usando \{\} + +
repetición usando * + + + + + +
repetición usando ? y + + + + +
secuencia de escape Unicode +
carácter comodín + + + + + +
aserción de límite de palabra +

Detalles semánticos

Anchor

Un delimitador coincide con una posición de la cadena de destino, no con un carácter. Un carácter ^ coincide con el principio de la cadena de destino y $ coincide con el final de la cadena de destino.

Referencia inversa

Una referencia inversa es una barra diagonal inversa seguida de un valor decimal N. Coincide con el contenido del eNésimo grupo de capturas. El valor de N no debe ser mayor que el número de grupos de captura que preceden a la referencia inversa. En basic y grep, el valor de N lo determina el dígito decimal que sigue a la barra diagonal inversa. En ECMAScript, el valor de N viene determinado por todos los dígitos decimales que siguen inmediatamente a la barra diagonal inversa. Por consiguiente, en basic y grep, el valor de N nunca es mayor que 9, aunque la expresión regular tenga más de nueve grupos de captura. En ECMAScript, el valor de N es unbounded.

Ejemplos:

  • ((a+)(b+))(c+)\3 coincide con la secuencia de destino "aabbbcbbb". La referencia inversa \3 coincide con el texto del tercer grupo de captura, es decir, "(b+)". No coincide con la secuencia de destino "aabbbcbb".

  • (a)\2 no es válido.

  • (b(((((((((a))))))))))\10 tiene significados diferentes en basic y en ECMAScript. En basic, la referencia inversa es \1. La referencia inversa coincide con el contenido del primer grupo de captura (es decir, el que comienza con (b y finaliza con el cierre ) y va antes de la referencia inversa), y el 0 final coincide con el carácter ordinario 0. En ECMAScript, la referencia inversa es \10. Coincide con el décimo grupo de captura, es decir, el más profundo.

Expresión entre corchetes

Una expresión entre corchetes define un conjunto de caracteres y los elementos de intercalación. Cuando la expresión entre corchetes comienza con el carácter ^, se produce la coincidencia correctamente si ningún elemento del conjunto coincide con el carácter actual en la secuencia de destino. Si no, se produce la coincidencia si alguno de los elementos del conjunto coincide con el carácter actual en la secuencia de destino.

El conjunto de caracteres puede definirse enumerando cualquier combinación de caracteres individuales, intervalos de caracteres, clases de caracteres, clases de equivalencia y símbolos de intercalación.

Grupo de captura

Un grupo de captura marca su contenido como una sola unidad en la gramática de expresiones regulares y etiqueta el texto de destino que coincide con su contenido. La etiqueta asociada a cada grupo de captura es un número, que se determina contando los paréntesis de apertura que marcan los grupos de captura e incluyendo el paréntesis de apertura que marca el grupo de captura actual. En esta implementación, el número máximo de grupos de captura es 31.

Ejemplos:

  • ab+ coincide con la secuencia de destino "abb", pero no coincide con la secuencia de destino "abab".

  • (ab)+ coincide con la secuencia de destino "abb", pero no coincide con la secuencia de destino "abab".

  • ((a+)(b+))(c+) coincide con la secuencia de destino "aabbbc" y asocia el grupo de captura 1 con la subsecuencia "aabbb", el grupo de captura 2 con la subsecuencia "aa", el grupo de captura 3 con "bbb" y el grupo de captura 4 con la subsecuencia "c".

Clase de carácter

Una clase de caracteres en una expresión entre corchetes agrega todos los caracteres de la clase con nombre al conjunto de caracteres definido por la expresión entre corchetes. Para crear una clase de caracteres, use [: seguido del nombre de la clase seguido de :].

Internamente, los nombres de las clases de caracteres se reconocen llamando a id = traits.lookup_classname. Un carácter ch pertenece a una clase de esas si traits.isctype(ch, id) devuelve true. La plantilla regex_traits predeterminada admite los nombres de clase incluidos en la tabla siguiente.

Class Name (Nombre de clase) Descripción
alnum letras minúsculas, mayúsculas y dígitos
alpha letras minúsculas y mayúsculas
blank espacio o tabulación
cntrl los caracteres de escape de formato de archivo
digit dígitos
graph letras minúsculas, mayúsculas, dígitos y signos de puntuación
lower letras minúsculas
print letras minúsculas, mayúsculas, dígitos, signos de puntuación y espacios
punct puntuación
space espacio
upper caracteres en mayúsculas
xdigit dígitos, a, b, c, d, e, f, A, B, C, D, E, F
d igual que digit
s igual que space
w igual que alnum

Intervalo de caracteres

Un intervalo de caracteres en una expresión entre corchetes agrega todos los caracteres del intervalo al conjunto de caracteres definido por la expresión entre corchetes. Para crear un intervalo de caracteres, hay que poner el carácter '-' entre el primero y el último carácter del intervalo. Un intervalo de caracteres pone todos los caracteres que tienen un valor numérico mayor o igual que el valor numérico del primer carácter, e igual o menor que el valor numérico del último carácter en el conjunto. Observe que este conjunto de caracteres agregados depende de la representación de caracteres específica de la plataforma. Si el carácter '-' aparece al principio o al final de una expresión entre corchetes, o como el primero o el último carácter de un intervalo de caracteres, se representa a sí mismo.

Ejemplos:

  • [0-7] representa el conjunto de caracteres { 0, 1, 2, 3, 4, 5, 6, 7 }. Coincide con las secuencias de destino "0", "1", etcétera, pero no con "a".

  • En los sistemas que usan la codificación de caracteres ASCII, [h-k] representa el conjunto de caracteres { h, i, j, k }. Coincide con las secuencias de destino "h", "i", etcétera, pero no con "\x8A" o "0".

  • En los sistemas que usan la codificación de caracteres EBCDIC, [h-k] representa el conjunto de caracteres{ h, i, '\x8A', '\x8B', '\x8C', '\x8D', '\x8E', '\x8F', '\x90', j, k } (h se codifica como 0x88 y k se codifica como 0x92). Coincide con las secuencias de destino "h", "i", "\x8A", etcétera, pero no con "0".

  • [-0-24] representa el conjunto de caracteres { -, 0, 1, 2, 4 }.

  • [0-2-] representa el conjunto de caracteres { 0, 1, 2, - }.

  • En los sistemas que usan la codificación de caracteres ASCII, [+--] representa el conjunto de caracteres { +,- }.

Sin embargo, cuando se utilizan intervalos que distinguen la configuración regional, los caracteres de un intervalo están determinados por las reglas de intercalación de la configuración regional. Los caracteres que se intercalan después del primer carácter y antes del último carácter de la definición del intervalo están en el conjunto. Los dos caracteres finales también están en el conjunto.

Elemento de intercalación

Un elemento de intercalación es una secuencia de varios caracteres que se interpreta como un único carácter.

Símbolo de intercalación

Un símbolo de intercalación en una expresión entre corchetes agrega un elemento de intercalación al conjunto definido por la expresión entre corchetes. Para crear un símbolo de intercalación, se usa [.. seguido del elemento de intercalación seguido de .]

Secuencia de escape de control

Una secuencia de escape de control es una barra diagonal inversa seguida de la letra 'c' seguida de una de las letras de la 'a' a la 'z' o de la 'A' a la 'Z'. Coincide con el carácter de control ASCII al que da nombre esa letra. Por ejemplo, "\x09" coincide con la secuencia de destino 0x09, porque Ctrl+I tiene el valor "\ci".

Carácter de escape DSW

Un escape de carácter dsw es un nombre corto para una clase de caracteres, como se muestra en la tabla siguiente.

Secuencia de escape Clase con nombre equivalente Clase con nombre predeterminada
\d [[:d:]] [[:digit:]]
\D [^[:d:]] [^[:digit:]]
\s [[:s:]] [[:space:]]
\S [^[:s:]] [^[:space:]]
\w [[:w:]] [a-zA-Z0-9_]*
\W [^[:w:]] [^a-zA-Z0-9_]*

*Juego de caracteres ASCII

Clase de equivalencia

Una clase de equivalencia en una expresión entre corchetes agrega todos los caracteres y los elementos de intercalación que son equivalentes al elemento de intercalación de la definición de clase de equivalencia al conjunto definido por la expresión entre corchetes.

Para crear una clase de equivalencia, se usa [= seguido de un elemento de intercalación seguido de =]. Internamente, dos elementos de intercalación elt1 y elt2 son equivalentes si traits.transform_primary(elt1.begin(), elt1.end()) == traits.transform_primary(elt2.begin(), elt2.end()).

Escape de formato de archivo

Un escape de formato de archivo consta de las secuencias de escape de caracteres de lenguaje C habituales, \\, \a, \b, \f, \n, \r, \t, \v. Tienen los significados habituales, es decir, una barra diagonal inversa, una alerta, un retroceso, un avance de página, una nueva línea, un retorno de carro, una tabulación horizontal y una tabulación vertical, respectivamente. En ECMAScript, \a y \b están permitidos. (Se permite \\, pero es un carácter de escape de identidad, no una secuencia de escape de caracteres).

Secuencia de escape hexadecimal

Una secuencia de escape hexadecimal es una barra diagonal inversa seguida de la letra x, seguida de dos dígitos hexadecimales (0-9a-fA-F). Coincide con un carácter de la secuencia de destino que tiene el valor especificado por los dos dígitos.

Por ejemplo, "\x41" coincide con la secuencia de destino "a" cuando se usa la codificación de caracteres ASCII.

Escape de identidad

Un escape de identidad es una barra diagonal inversa seguida de un único carácter. Coincide con ese carácter. Se requiere cuando el carácter tiene un significado especial. El uso del carácter de escape de identidad quita el significado especial. Por ejemplo:

  • a* coincide con la secuencia de destino "aaa", pero no coincide con la secuencia de destino "a*".

  • a\* coincide con la secuencia de destino "aaa", pero no coincide con la secuencia de destino "a*".

El conjunto de caracteres que se permite en un escape de identidad depende de la gramática de expresiones regulares, como se muestra en la tabla siguiente.

Grammar Caracteres de escape de identidad permitidos
basic, grep { (){}.[\*^$ }
extended, egrep { (){.[\*^$+?| }
awk, extended más { "/ }
ECMAScript Todos los caracteres excepto los que pueden formar parte de un identificador. Por lo general, esto incluye letras, dígitos, $, _ y secuencias de escape Unicode. Para obtener más información, consulte la Especificación ECMAScript.

Carácter individual

Un carácter individual en una expresión entre corchetes agrega ese carácter al conjunto de caracteres definido por la expresión entre corchetes. En cualquier parte de una expresión entre corchetes excepto al principio, un carácter ^ se representa a sí mismo.

Ejemplos:

  • [abc] coincide con las secuencias de destino "a", "b" y "c", pero no con la secuencia "d".

  • [^abc] coincide con la secuencia de destino "d", pero no con las secuencias "a", "b", o "c".

  • [a^bc] coincide con la secuencia de destino "a", "b", "c" y "^" pero no con la secuencias "d".

En todas las gramáticas de expresiones regulares excepto en ECMAScript, si un carácter ] es el primero que sigue a la apertura [ o el primero que sigue a un carácter ^ inicial, se representa a sí mismo.

Ejemplos:

  • []a no es válido porque no hay ningún carácter ] que finalice la expresión entre corchetes.

  • []abc] coincide con la secuencia de destino "a", "b", "c" y "]" pero no con la secuencias "d".

  • [^]abc] coincide con la secuencia de destino "d", pero no con las secuencias "a", "b", "c" o "]".

En ECMAScript, se usa \] para representar el carácter ] en una expresión entre corchetes.

Ejemplos:

  • []a coincide con la secuencia de destino "a" porque la expresión entre corchetes está vacía.

  • [\]abc] coincide con la secuencia de destino "a", "b", "c" y "]" pero no con la secuencias "d".

Aserción negativa

Una aserción negativa coincide con todo menos con su contenido. No consume ningún carácter de la secuencia de destino.

Por ejemplo, (!aa)(a*) coincide con la secuencia de destino "a" y asocia el grupo de capturas 1 con la subsecuencia "a". No coincide con la secuencia de destino "aa" o con la secuencia de destino "aaa".

Aserción de límite de palabra negativa

Una aserción de límite de palabra negativa coincide si la posición actual en la cadena de destino no está inmediatamente después de un límite de palabra.

Grupo de no-captura

Un grupo de no-captura marca su contenido como una sola unidad en la gramática de expresiones regulares, pero no etiqueta el texto de destino.

Por ejemplo, (a)(?:b)*(c) coincide con el texto de destino "abbc" y asocia el grupo de capturas 1 con la subsecuencia "a" y el grupo de capturas 2 con la subsecuencia "c".

Repetición no expansiva

Una repetición no expansiva usa la subsecuencia más corta de la secuencia de destino que coincida con el patrón. Una repetición expansiva usa la más larga. Por ejemplo, (a+)(a*b) coincide con la secuencia de destino "aaab".

Cuando se utiliza una repetición no expansiva, esta asocia el grupo de captura 1 con la subsecuencia "a" al principio de la secuencia de destino y el grupo de destino 2 con la subsecuencia "aab" al final de la secuencia de destino.

Cuando se utiliza una coincidencia expansiva, esta asocia el grupo de captura 1 con la subsecuencia "aaa" y el grupo de captura 2 con la subsecuencia "b".

Secuencia de escape octal

Una secuencia de escape octal es una barra diagonal inversa seguida de uno, dos o tres dígitos octales (0-7). Coincide con un carácter de la secuencia de destino que tiene el valor especificado por esos dígitos. Si todos los dígitos son 0, la secuencia no es válida.

Por ejemplo, \101 coincide con la secuencia de destino "a" cuando se usa la codificación de caracteres ASCII.

Caracteres ordinarios

Un carácter ordinario es cualquier carácter válido que no tiene ningún significado especial en la gramática actual.

En ECMAScript, los caracteres siguientes tienen significados especiales:

  • ^ $ \ . * + ? ( ) [ ] { } |

En basic y grep, los caracteres siguientes tienen significados especiales:

  • . [ \

También en basic y grep, los caracteres siguientes tienen significados especiales cuando se utilizan en un contexto determinado:

  • * tiene un significado especial en todos los casos excepto cuando es el primero de una expresión regular o el primero que sigue a un carácter ^ inicial en una expresión regular, o cuando es el primero de un grupo de captura o el primero que sigue a un carácter ^ inicial en un grupo de captura.

  • ^ tiene un significado especial cuando es el primer carácter de una expresión regular.

  • $ tiene un significado especial cuando es el último carácter de una expresión regular.

En extended y egrep y awk, los caracteres siguientes tienen significados especiales:

  • . [ \ ( * + ? { |

También en extended, egrep y awk los caracteres siguientes tienen significados especiales cuando se utilizan en un contexto determinado.

  • ) tiene un significado especial cuando coincide con un carácter ( precedente

  • ^ tiene un significado especial cuando es el primer carácter de una expresión regular.

  • $ tiene un significado especial cuando es el último carácter de una expresión regular.

Un carácter ordinario coincide con el mismo carácter en la secuencia de destino. De forma predeterminada, esto significa que se produce la coincidencia si los dos caracteres se representan mediante el mismo valor. En una coincidencia sin distinción entre mayúsculas y minúsculas, dos caracteres ch0 y ch1 coinciden si traits.translate_nocase(ch0) == traits.translate_nocase(ch1). En una coincidencia que distingue la configuración regional, dos caracteres ch0 y ch1 coinciden si traits.translate(ch0) == traits.translate(ch1).

Aserción positiva

Una aserción positiva coincide con su contenido, pero no utiliza ningún carácter de la secuencia de destino.

Ejemplos:

  • (=aa)(a*) coincide con la secuencia de destino "aaaa" y asocia el grupo de capturas 1 con la subsecuencia "aaaa".

  • (aa)(a*) coincide con la secuencia de destino "aaaa" y asocia el grupo 1 de captura con la subsecuencia "aa" al principio de la secuencia de destino y el grupo de captura 2 con la subsecuencia "aa" al final de la secuencia de destino.

  • (=aa)(a)|(a) coincide con la secuencia de destino "a" y asocia el grupo de capturas 1 con una secuencia vacía (porque se produjo un error en la aserción positiva) y el grupo de capturas 2 con la subsecuencia "a". También coincide con la secuencia de destino "aa" y asocia el grupo de captura 1 con la subsecuencia "aa" y el grupo de captura 2 con una secuencia vacía.

Secuencia de escape Unicode

Una secuencia de escape unicode es una barra diagonal inversa seguida de la letra 'u', seguida de cuatro dígitos hexadecimales (0-9a-fA-F). Coincide con un carácter de la secuencia de destino que tiene el valor especificado por los cuatro dígitos. Por ejemplo, \u0041 coincide con la secuencia de destino "a" cuando se usa la codificación de caracteres ASCII.

Carácter comodín

Un carácter comodín coincide con cualquier carácter de la expresión de destino excepto con una nueva línea.

Límite de palabra

Un límite de palabra aparece en las situaciones siguientes:

  • El carácter actual está al principio de la secuencia de destino y es uno de los caracteres alfabéticos A-Za-z0-9_

  • La posición del carácter actual se pasa al final de la secuencia de destino y el último carácter de la secuencia de destino es uno de los caracteres alfabéticos.

  • El carácter actual es uno de los caracteres alfabéticos y el carácter precedente no lo es.

  • El carácter actual no es uno de los caracteres alfabéticos y el carácter precedente no lo es.

Aserción de límite de palabra

Una aserción de límite de palabra coincide cuando la posición actual en la cadena de destino está inmediatamente después de un límite de palabra.

Coincidencias y búsquedas

Para que una expresión regular coincida con una secuencia de destino, la expresión regular completa debe coincidir con la secuencia de destino completa. Por ejemplo, la expresión regular bcd coincide con la secuencia de destino "bcd" pero no coincide con la secuencia de destino "abcd" ni "bcde".

Para que una búsqueda de expresiones regulares dé resultado, debe haber una subsecuencia en alguna parte de la secuencia de destino que coincida con la expresión regular. La búsqueda encuentra, normalmente, la subsecuencia coincidente situada más a la izquierda.

Ejemplos:

  • Una búsqueda de la expresión regular bcd en la secuencia de destino "bcd" da resultado correcto y coincide con la secuencia completa. La misma búsqueda en la secuencia de destino "abcd" también da resultado y coincide con los tres últimos caracteres. La misma búsqueda en la secuencia de destino "bcde" también da resultado y coincide con los tres primeros caracteres.

  • Una búsqueda de la expresión regular bcd en la secuencia de destino "bcdbcd" da resultado y coincide con los tres primeros caracteres.

Si hay más de una subsecuencia que coincida en alguna ubicación en la secuencia de destino, hay dos maneras de elegir el patrón coincidente.

La primera coincidencia elige la subsecuencia que se encuentra primero cuando coincide la expresión regular.

La coincidencia más larga elige la subsecuencia más larga entre las que coinciden en esa ubicación. Si hay más de una subsecuencia que tenga la longitud máxima, la coincidencia más larga elige la que se encontró en primer lugar.

Por ejemplo, cuando se usa la primera coincidencia, una búsqueda de la expresión regular b|bc en la secuencia de destino "abcd" coincide con la subsecuencia "b", porque el término de la izquierda de la alternancia coincide con esa subsecuencia; por tanto, la primera coincidencia no prueba con el término de la derecha de la alternancia. Cuando se utiliza la coincidencia más larga, la misma búsqueda coincide con "bc" porque "bc" es más larga que "b".

Una coincidencia parcial da resultado si la coincidencia llega al final de la secuencia de destino sin dar error, incluso si no alcanza el final de la expresión regular. Por consiguiente, después de que una coincidencia parcial dé resultado, anexar los caracteres a la secuencia de destino puede causar que una coincidencia parcial posterior dé error. Sin embargo, después de que una coincidencia parcial dé error, anexar los caracteres a la secuencia de destino no puede causar que una coincidencia parcial posterior dé resultado correcto. Por ejemplo, con una coincidencia parcial, ab coincide con la secuencia de destino "a" pero no con "ac".

Marcas de formato

ECMAScript Reglas de formato Reglas de formato usadas Texto de sustitución
$& & La secuencia de caracteres que coincide con la expresión regular completa: [match[0].first, match[0].second)
$$ $
\& &
$`" (signo de dólar seguido de comilla simple de apertura) La secuencia de caracteres que precede a la subsecuencia que coincide con la expresión regular: [match.prefix().first, match.prefix().second)
$'" (signo de dólar seguido de comilla simple de cierre) La secuencia de caracteres que sigue a la subsecuencia que coincide con la expresión regular: [match.suffix().first, match.suffix().second)
$n \n La secuencia de caracteres que coincide con el grupo de captura en la posición n, donde n es un número entre 0 y 9: [match[n].first, match[n].second)
\\n \n
$nn La secuencia de caracteres que coincide con el grupo de captura en la posición nn, donde nn es un número entre 10 y 99: [match[nn].first, match[nn].second)

Consulte también

Información general sobre la biblioteca estándar de C++