En esta página

QRegExp Class

La clase QRegExp proporciona concordancia de patrones utilizando expresiones regulares. Más...

Cabecera: #include <QRegExp>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core5Compat)
target_link_libraries(mytarget PRIVATE Qt6::Core5Compat)
qmake: QT += core5compat

Nota: Todas las funciones de esta clase son reentrantes.

Tipos Públicos

enum CaretMode { CaretAtZero, CaretAtOffset, CaretWontMatch }
enum PatternSyntax { RegExp, RegExp2, Wildcard, WildcardUnix, FixedString, W3CXmlSchema11 }

Funciones públicas

QRegExp()
QRegExp(const QString &pattern, Qt::CaseSensitivity cs = Qt::CaseSensitive, QRegExp::PatternSyntax syntax = RegExp)
QRegExp(const QRegExp &rx)
~QRegExp()
QString cap(int nth = 0) const
int captureCount() const
QStringList capturedTexts() const
Qt::CaseSensitivity caseSensitivity() const
int countIn(const QString &str) const
QString errorString() const
bool exactMatch(const QString &str) const
QStringList filterList(const QStringList &stringList) const
int indexIn(const QStringList &list, int from) const
int indexIn(const QString &str, int offset = 0, QRegExp::CaretMode caretMode = CaretAtZero) const
bool isEmpty() const
bool isMinimal() const
bool isValid() const
int lastIndexIn(const QStringList &list, int from) const
int lastIndexIn(const QString &str, int offset = -1, QRegExp::CaretMode caretMode = CaretAtZero) const
int matchedLength() const
QString pattern() const
QRegExp::PatternSyntax patternSyntax() const
int pos(int nth = 0) const
QString removeIn(const QString &str) const
QString replaceIn(const QString &str, const QString &after) const
QStringList replaceIn(const QStringList &stringList, const QString &after) const
void setCaseSensitivity(Qt::CaseSensitivity cs)
void setMinimal(bool minimal)
void setPattern(const QString &pattern)
void setPatternSyntax(QRegExp::PatternSyntax syntax)
QStringList splitString(const QString &str, Qt::SplitBehavior behavior = Qt::KeepEmptyParts) const
void swap(QRegExp &other)
operator QVariant() const
bool operator!=(const QRegExp &rx) const
QRegExp &operator=(QRegExp &&other)
QRegExp &operator=(const QRegExp &rx)
bool operator==(const QRegExp &rx) const

Miembros públicos estáticos

QString escape(const QString &str)
size_t qHash(const QRegExp &key, size_t seed = 0)
QDataStream &operator<<(QDataStream &out, const QRegExp &regExp)
QDataStream &operator>>(QDataStream &in, QRegExp &regExp)

Descripción detallada

Esta clase está obsoleta en Qt 6. Por favor, utilice QRegularExpression en su lugar para todo el código nuevo. Para directrices sobre la portabilidad de código antiguo de QRegExp a QRegularExpression, véase {Porting to QRegularExpression}

Una expresión regular, o "regexp", es un patrón para emparejar subcadenas en un texto. Resulta útil en muchos contextos, por ejemplo,

ValidaciónUna regexp puede comprobar si una subcadena cumple ciertos criterios, por ejemplo, si es un número entero o no contiene espacios en blanco.
BúsquedaUna regexp permite buscar patrones más potentes que una simple subcadena. Por ejemplo, puede buscar una de las palabras mail, letter o correspondence, pero ninguna de las palabras email, mailman, mailer, letterbox, etc.
Buscar y reemplazarUna regexp puede sustituir todas las apariciones de una subcadena por una subcadena diferente, por ejemplo, sustituir todas las apariciones de & por &amp; excepto si & ya va seguida de un amp;.
División de cadenasUna expresión regular puede utilizarse para identificar dónde debe dividirse una cadena, por ejemplo, para dividir cadenas delimitadas por tabuladores.

Se presenta una breve introducción a las expresiones regulares, una descripción del lenguaje de expresiones regulares de Qt, algunos ejemplos y la propia documentación de la función. QRegExp sigue el modelo del lenguaje regexp de Perl. Es totalmente compatible con Unicode. QRegExp también se puede utilizar en un modo comodín más sencillo, similar a la funcionalidad de los intérpretes de comandos. Las reglas sintácticas utilizadas por QRegExp pueden modificarse con setPatternSyntax(). En concreto, la sintaxis del patrón se puede establecer en QRegExp::FixedString, lo que significa que el patrón que se va a comparar se interpreta como una cadena sin formato, es decir, no se escapan los caracteres especiales (por ejemplo, la barra invertida).

Un buen texto sobre regexps es Mastering Regular Expressions (Third Edition) de Jeffrey E. F. Friedl, ISBN 0-596-52812-4.

Nota: En Qt 5, la nueva clase QRegularExpression proporciona una implementación compatible con Perl de expresiones regulares y se recomienda en lugar de QRegExp.

Introducción

Las expresiones regulares se construyen a partir de expresiones, cuantificadores y aserciones. La expresión más simple es un carácter, por ejemplo x o 5. Una expresión también puede ser un conjunto de caracteres encerrados entre corchetes. [ ABCD] coincidirá con una A, una B, una C o una D. Podemos escribir esta misma expresión como [A-D], y una expresión que coincida con cualquier letra mayúscula del alfabeto inglés se escribe como [A-Z].

Un cuantificador especifica el número de apariciones de una expresión que debe coincidir. x{1,1} significa que coincide con una y sólo una x. x{1,5} significa que coincide con una secuencia de x caracteres que contiene al menos una x pero no más de cinco.

Tenga en cuenta que, en general, las expresiones regulares no se pueden utilizar para comprobar paréntesis equilibrados o etiquetas. Por ejemplo, se puede escribir una regexp para que coincida con un html de apertura <b> y su cierre </b>, si las etiquetas <b> no están anidadas, pero si las etiquetas <b> están anidadas, esa misma regexp coincidirá con una etiqueta de apertura <b> con el cierre incorrecto </b>. Para el fragmento <b>bold <b>bolder</b></b>, el primer <b> coincidiría con el primer </b>, lo que no es correcto. Sin embargo, es posible escribir una regexp que empareje correctamente paréntesis o etiquetas anidados, pero sólo si el número de niveles de anidamiento es fijo y conocido. Si el número de niveles de anidamiento no es fijo y conocido, es imposible escribir una regexp que no falle.

Supongamos que queremos que una regexp coincida con números enteros en el rango de 0 a 99. Se requiere al menos un dígito, así que empezamos con la expresión [0-9]{1,1}, que coincide con un solo dígito exactamente una vez. Esta expresión regular coincide con números enteros del 0 al 9. Para que coincida con números enteros de hasta 99, aumente el número máximo de ocurrencias a 2, de modo que la regexp se convierta en [0-9]{1,2}. Esta regexp satisface el requisito original de coincidir con los números enteros de 0 a 99, pero también coincidirá con los números enteros que aparecen en medio de las cadenas. Si queremos que el entero coincidente sea toda la cadena, debemos utilizar las aserciones de anclaje, ^ (signo de intercalación) y $ (dólar). Cuando ^ es el primer carácter de una regexp, significa que la regexp debe coincidir desde el principio de la cadena. Cuando $ es el último carácter de la expresión regular, significa que debe coincidir hasta el final de la cadena. La expresión regular se convierte en ^ [0-9]{1,2}$. Tenga en cuenta que las aserciones, por ejemplo ^ y $, no coinciden con caracteres sino con ubicaciones en la cadena.

Si ha visto expresiones regulares descritas en otros sitios, es posible que tengan un aspecto distinto de las que se muestran aquí. Esto se debe a que algunos conjuntos de caracteres y algunos cuantificadores son tan comunes que se les han asignado símbolos especiales para representarlos. [ 0-9] puede sustituirse por el símbolo \d. El cuantificador para que coincida exactamente con una ocurrencia, {1,1}, puede sustituirse por la propia expresión, es decir, x{1,1} es lo mismo que x. Por lo tanto, nuestro comparador de 0 a 99 podría escribirse como ^ \d{1 ,2}$. También se puede escribir ^ \d\d {0 ,1}$, es decir, desde el principio de la cadena, coincide con un dígito, seguido inmediatamente por 0 o 1 dígitos. En la práctica, se escribiría como ^ \d\d?$. ? es la abreviatura del cuantificador {0,1}, es decir, 0 ó 1 ocurrencias. ? hace que una expresión sea opcional. El regexp ^ \d\d?$ significa Desde el principio de la cadena, coincide con un dígito, seguido inmediatamente por 0 o 1 dígito más, seguido inmediatamente por el final de la cadena.

Para escribir una expresión regular que coincida con una de las palabras "correo" o "carta" o "correspondencia", pero que no coincida con palabras que contengan estas palabras, por ejemplo, "correo electrónico", "cartero", "cartero" y "buzón", comience con una expresión regular que coincida con "correo". Expresada de forma completa, la regexp es m{1,1}a{1,1}i{1,1}l{1,1}, pero como una expresión de caracteres se cuantifica automáticamente por {1,1}, podemos simplificar la regexp a mail, es decir, una 'm' seguida de una 'a' seguida de una 'i' seguida de una 'l'. Ahora podemos utilizar la barra vertical |, que significa o, para incluir las otras dos palabras, por lo que nuestra regexp para coincidir con cualquiera de las tres palabras se convierte en mail|carta|correspondencia. Coincide con 'correo' o 'carta' o 'correspondencia'. Aunque esta expresión regular coincidirá con una de las tres palabras que queremos que coincidan, también coincidirá con palabras que no queremos que coincidan, por ejemplo, "correo electrónico". Para evitar que la expresión regular coincida con palabras no deseadas, debemos indicarle que empiece y termine la coincidencia en los límites de las palabras. Primero encerramos la expresión regular entre paréntesis, (correo|carta|correspondencia). Los paréntesis agrupan expresiones e identifican una parte de la expresión regular que deseamos capture. Al encerrar la expresión entre paréntesis, podemos utilizarla como componente en expresiones regulares más complejas. También nos permite examinar cuál de las tres palabras ha coincidido realmente. Para forzar que la coincidencia empiece y termine en los límites de las palabras, encerramos la expresión regular en \b aserciones de límite de palabra: \b(correo|carta|correspondencia)\b. Ahora la expresión regular significa: Coincidir con un límite de palabra, seguido de la expresión regular entre paréntesis, seguida de un límite de palabra. La aserción \b coincide con una posición de la expresión regular, no con un carácter. Un límite de palabra es cualquier carácter que no sea una palabra, por ejemplo, un espacio, una nueva línea o el principio o el final de una cadena.

Si queremos sustituir los caracteres ampersand por la entidad HTML &amp;, la expresión regular a utilizar es simplemente &. Pero esta expresión regular también coincidirá con los ampersands que ya se hayan convertido en entidades HTML. Sólo queremos sustituir los ampersands que no vayan seguidos de amp;. Para ello, necesitamos la aserción lookahead negativa, (?!__). La expresión regular puede escribirse como &(?!amp;), es decir, coincide con un ampersand que no vaya seguido de amp;.

Si queremos contar todas las apariciones de 'Eric' y 'Eirik' en una cadena, dos soluciones válidas son \b(Eric|Eirik)\b y \bEi?ri[ck]\b. La aserción de límite de palabra '\b' es necesaria para evitar coincidencias con palabras que contengan cualquiera de los dos nombres, por ejemplo, 'Ericsson'. Observe que la segunda expresión regular coincide con más grafías de las que deseamos: "Eric", "Erik", "Eiric" y "Eirik".

Algunos de los ejemplos anteriores se explican en la sección code examples.

Caracteres y abreviaturas de conjuntos de caracteres

ElementoSignificado
cUn carácter se representa a sí mismo a menos que tenga un significado regexp especial. p. ej., c coincide con el carácter c.
\cUn carácter que sigue a una barra invertida coincide con el propio carácter, excepto en los casos especificados a continuación. p. ej., para que coincida con un signo de intercalación literal al principio de una cadena, escriba \^.
\aCoincide con la campana ASCII (BEL, 0x07).
\fCoincide con el salto de línea ASCII (FF, 0x0C).
\nCoincide con el salto de línea ASCII (LF, 0x0A, Unix newline).
\rCoincide con el retorno de carro ASCII (CR, 0x0D).
\tCoincide con el tabulador horizontal ASCII (HT, 0x09).
\vCoincide con el tabulador vertical ASCII (VT, 0x0B).
\xhhhhCoincide con el carácter Unicode correspondiente al número hexadecimal hhhh (entre 0x0000 y 0xFFFF).
\0ooo (es decir, \zero ooo)coincide con el carácter ASCII/Latin1 correspondiente al número octal ooo (entre 0 y 0377).
. (punto)Coincide con cualquier carácter (incluida la nueva línea).
\dCoincide con un dígito (QChar::isDigit()).
\DCoincide con un no dígito.
\sCoincide con un espacio en blanco (QChar::isSpace()).
\SCoincide con un carácter que no sea un espacio en blanco.
\wCoincide con un carácter de palabra (QChar::isLetterOrNumber(), QChar::isMark(), o '_').
\WCoincide con un carácter que no sea una palabra.
\nLa n-ésima referencia, por ejemplo \1, \2, etc.

Nota: El compilador de C++ transforma las barras invertidas en cadenas. Para incluir una \ en una regexp, introdúzcala dos veces, es decir, \\. Para que coincida con el propio carácter de barra invertida, introdúzcalo cuatro veces, es decir, \\\\.

Conjuntos de caracteres

Los corchetes significan que coinciden con cualquier carácter contenido en los corchetes. Las abreviaturas de conjuntos de caracteres descritas anteriormente pueden aparecer en un conjunto de caracteres entre corchetes. Salvo las abreviaturas del juego de caracteres y las dos excepciones siguientes, los caracteres no tienen significados especiales entre corchetes.

^El signo de intercalación niega el conjunto de caracteres si aparece como primer carácter (es decir, inmediatamente después del corchete de apertura). [ abc] coincide con 'a' o 'b' o 'c', pero [^abc ] coincide con todo menos con 'a' o 'b' o 'c'.
-El guión indica un rango de caracteres. [ W-Z] coincide con 'W' o 'X' o 'Y' o 'Z'.

El uso de las abreviaturas predefinidas del juego de caracteres es más portable que el uso de rangos de caracteres entre plataformas e idiomas. Por ejemplo, [0-9 ] coincide con un dígito en alfabetos occidentales, pero \d coincide con un dígito de cualquier alfabeto.

Nota: En otra documentación sobre expresiones regulares, los conjuntos de caracteres suelen denominarse "clases de caracteres".

Cuantificadores

Por defecto, una expresión se cuantifica automáticamente con {1,1}, es decir, debe aparecer exactamente una vez. En la siguiente lista, E significa expresión. Una expresión es un carácter, o la abreviatura de un conjunto de caracteres, o un conjunto de caracteres entre corchetes, o una expresión entre paréntesis.

E?Coincide con cero o una ocurrencias de E. Este cuantificador significa La expresión anterior es opcional, porque coincidirá tanto si se encuentra la expresión como si no. E? es lo mismo que E{0,1}. Por ejemplo, dents? coincide con 'dent' o 'dents'.
E+Coincide con una o más ocurrencias de E. E+ es lo mismo que E{1,}. p. ej., 0+ coincide con '0', '00', '000', etc.
E*Coincide con cero o más apariciones de E. Es lo mismo que E{0,}. El cuantificador * se utiliza a menudo en errores donde debería utilizarse +. Por ejemplo, si se utiliza \s*$ en una expresión para coincidir con cadenas que terminan en espacios en blanco, coincidirá con todas las cadenas porque \s*$ significa Coincidir con cero o más espacios en blanco seguidos del final de la cadena. La expresión regular correcta para buscar cadenas que tengan al menos un carácter de espacio en blanco al final es \s+$.
E{n}Coincide exactamente con n apariciones de E. E{n} es lo mismo que repetir E n veces. Por ejemplo, x{5} es lo mismo que xxxxx. También es lo mismo que E{n,n}, por ejemplo x{5,5}.
E{n,}Coincide con al menos n apariciones de E.
E{,m}Coincide como máximo con m apariciones de E. E{,m} es lo mismo que E{0,m}.
E{n,m}Coincide como mínimo con n y como máximo con m ocurrencias de E.

Para aplicar un cuantificador a más de un carácter precedente, utilice paréntesis para agrupar caracteres en una expresión. Por ejemplo, tag+ coincide con una "t" seguida de una "a" seguida de al menos una "g", mientras que (tag)+ coincide con al menos una aparición de "tag".

Nota: Los cuantificadores suelen ser "codiciosos". Siempre coinciden con todo el texto que pueden. Por ejemplo, 0+ coincide con el primer cero que encuentra y con todos los ceros consecutivos después del primer cero. Aplicado a "20005", coincide con "20005". Los cuantificadores pueden hacerse no codiciosos, véase setMinimal().

Captura de texto

Los paréntesis nos permiten agrupar elementos para poder cuantificarlos y capturarlos. Por ejemplo, si tenemos la expresión mail|carta|correspondencia que coincide con una cadena, sabemos que una de las palabras coincide, pero no cuál. El uso de paréntesis nos permite "capturar" todo lo que coincida dentro de sus límites, de modo que si utilizamos (mail|carta|correspondencia) y comparamos esta regexp con la cadena "Te envié un correo electrónico" podemos utilizar las funciones cap() o capturedTexts() para extraer los caracteres coincidentes, en este caso 'mail'.

Podemos utilizar el texto capturado dentro de la propia regexp. Para hacer referencia al texto capturado utilizamos backreferences que se indexan a partir de 1, igual que para cap(). Por ejemplo, podríamos buscar palabras duplicadas en una cadena utilizando \b( \w+ )\W + \1\b , lo que significa que coincide con un límite de palabra seguido de uno o más caracteres de palabra seguidos de uno o más caracteres que no son de palabra seguidos del mismo texto que la primera expresión entre paréntesis seguida de un límite de palabra.

Si queremos utilizar los paréntesis únicamente para agrupar y no para capturar, podemos utilizar la sintaxis de no captura, por ejemplo (?:verde|azul). Los paréntesis de no captura empiezan con '(?:' y terminan con ')'. En este ejemplo coincidimos con 'verde' o 'azul', pero no capturamos la coincidencia, por lo que sólo sabemos si hemos coincidido o no, pero no qué color hemos encontrado. El uso de paréntesis no capturadores es más eficiente que el uso de paréntesis capturadores, ya que el motor regexp tiene que hacer menos contabilidad.

Tanto los paréntesis de captura como los de no captura pueden estar anidados.

Por razones históricas, los cuantificadores (por ejemplo, *) que se aplican a los paréntesis de captura son más "codiciosos" que otros cuantificadores. Por ejemplo, a*(a*) coincidirá con "aaa" con cap(1) == "aaa". Este comportamiento es diferente del de otros motores de expresiones regulares (en particular, Perl). Para obtener un comportamiento de captura más intuitivo, especifique QRegExp::RegExp2 al constructor de QRegExp o llame a setPatternSyntax(QRegExp::RegExp2).

Cuando el número de coincidencias no puede determinarse de antemano, un lenguaje común es utilizar cap() en un bucle. Por ejemplo:

QRegExp rx("(\\d+)");
QString str = "Offsets: 12 14 99 231 7";
QStringList list;
int pos = 0;

while ((pos = rx.indexIn(str, pos)) != -1) {
    list << rx.cap(1);
    pos += rx.matchedLength();
}
// list: ["12", "14", "99", "231", "7"]

Afirmaciones

Las aserciones hacen alguna declaración sobre el texto en el punto en el que aparecen en la regexp, pero no coinciden con ningún carácter. En la siguiente lista , E significa cualquier expresión.

^El signo de intercalación indica el principio de la cadena. Si desea que coincida con un literal ^ debe escaparlo escribiendo \\^. Por ejemplo, ^#include sólo coincidirá con cadenas que empiecen por los caracteres '#include'. (Cuando el signo de intercalación es el primer carácter de un conjunto de caracteres tiene un significado especial, véase Sets of Characters.)
$El dólar significa el final de la cadena. Por ejemplo, \d\s *$ coincidirá con cadenas que terminen con un dígito seguido opcionalmente de un espacio en blanco. Si desea que coincida con un literal $ debe escapar escribiendo \\$.
\bUn límite de palabra. Por ejemplo, la expresión regular \bOK\b significa que coincide inmediatamente después de un límite de palabra (por ejemplo, el inicio de una cadena o un espacio en blanco) con la letra "O" y, a continuación, con la letra "K" inmediatamente antes de otro límite de palabra (por ejemplo, el final de una cadena o un espacio en blanco). Pero tenga en cuenta que la aserción en realidad no coincide con ningún espacio en blanco, así que si escribimos (\bOK\b ) y tenemos una coincidencia, sólo contendrá 'OK' aunque la cadena sea "Ahora está bien ".
\BUn límite sin palabras. Esta afirmación es verdadera siempre que \b es falsa. Por ejemplo, si buscamos \Bon\B en "Left on" la coincidencia fallaría (el espacio y el final de la cadena no son límites no-palabra), pero coincidiría en "tonne".
(?=E)Búsqueda positiva. Esta afirmación es verdadera si la expresión coincide en este punto de la expresión regular. Por ejemplo, const(?=\s+char) coincide con "const" siempre que vaya seguido de "char", como en "static const char *". (Compárese con const\s+char, que coincide con 'static const char *').
(?!E)Espera negativa. Esta afirmación es verdadera si la expresión no coincide en este punto de la expresión regular. Por ejemplo, const(?!\s +char ) coincide con 'const' excepto cuando va seguida de 'char'.

Coincidencia de comodines

La mayoría de los shells de comandos, como bash o cmd.exe, admiten "file globbing", es decir, la posibilidad de identificar un grupo de archivos mediante comodines. La función setPatternSyntax() se utiliza para cambiar entre el modo regexp y el modo comodín. Las coincidencias con comodines son mucho más sencillas que las regexps completas y sólo tienen cuatro funciones:

cCualquier carácter se representa a sí mismo, salvo los mencionados a continuación. Así, c coincide con el carácter c.
?Coincide con cualquier carácter. Es igual que . en los regexps completos.
*Coincide con cero o más caracteres cualesquiera. Es igual que .* en expresiones regulares completas.
[...]Los conjuntos de caracteres pueden representarse entre corchetes, de forma similar a los regexps completos. Dentro de la clase de caracteres, al igual que fuera de ella, la barra invertida no tiene ningún significado especial.

En el modo Wildcard, los caracteres comodín no pueden escaparse. En el modo WildcardUnix, el carácter '\' escapa del comodín.

Por ejemplo, si estamos en modo comodín y tenemos cadenas que contienen nombres de archivos, podríamos identificar los archivos HTML con *.html. Esto coincidirá con cero o más caracteres seguidos de un punto seguido de 'h', 't', 'm' y 'l'.

Para contrastar una cadena con una expresión comodín, utilice exactMatch(). Por ejemplo:

QRegExp rx("*.txt");
rx.setPatternSyntax(QRegExp::Wildcard);
rx.exactMatch("README.txt");        // returns true
rx.exactMatch("welcome.txt.bak");   // returns false

Notas para usuarios de Perl

La mayoría de las abreviaturas de clases de caracteres admitidas por Perl son compatibles con QRegExp, véase characters and abbreviations for sets of characters.

En QRegExp, aparte de dentro de las clases de caracteres, ^ siempre significa el inicio de la cadena, por lo que las carets siempre deben ser escapadas a menos que se usen para ese propósito. En Perl, el significado de un signo de intercalación varía automáticamente dependiendo de dónde aparezca, por lo que rara vez es necesario escaparlo. Lo mismo ocurre con $, que en QRegExp siempre significa el final de la cadena.

Los cuantificadores de QRegExp son los mismos que los cuantificadores codiciosos de Perl (pero consulte note above). La concordancia no codiciosa no puede aplicarse a cuantificadores individuales, pero puede aplicarse a todos los cuantificadores del patrón. Por ejemplo, para que coincida con el regexp de Perl ro+?m requiere:

QRegExp rx("ro+m");
rx.setMinimal(true);

El equivalente de la opción /i de Perl es setCaseSensitivity(Qt::CaseInsensitive).

La opción /g de Perl puede emularse mediante loop.

En QRegExp . coincide con cualquier caracter, por lo tanto todas las regexps QRegExp tienen el equivalente de la opción /s de Perl. QRegExp no tiene un equivalente a la opción /m de Perl, pero ésta puede emularse de varias maneras, por ejemplo dividiendo la entrada en líneas o haciendo un bucle con una regexp que busque nuevas líneas.

Dado que QRegExp está orientado a cadenas, no existen las aserciones \A, \Z o \z. La aserción \G no está soportada pero puede emularse en un bucle.

$& de Perl es cap(0) o capturedTexts()[0]. No hay equivalentes QRegExp para $`, $' o $+. Las variables de captura de Perl, $1, $2, ... corresponden a cap(1) o capturedTexts()[1], cap(2) o capturedTexts()[2], etc.

Para sustituir un patrón utilice QString::replace().

La sintaxis extendida /x de Perl no está soportada, como tampoco lo están las directivas, por ejemplo (?i), ni los comentarios regexp, por ejemplo (?#comment). Por otro lado, las reglas de C++ para cadenas literales pueden utilizarse para conseguir lo mismo:

QRegExp mark("\\b"      // word boundary
              "[Mm]ark" // the word we want to match
            );

Las aserciones lookbehind positivas de ancho cero y negativas de ancho cero (?=patrón) y (?!patrón) están soportadas con la misma sintaxis que Perl. Las aserciones lookbehind de Perl, las subexpresiones "independientes" y las expresiones condicionales no están soportadas.

Los paréntesis no capturadores también están soportados, con la misma sintaxis (?:pattern).

Consulte QString::split() y QStringList::join() para ver los equivalentes a las funciones split y join de Perl.

Nota: debido a que C++ transforma los \ deben escribirse dos veces en el código, por ejemplo \b debe escribirse \\b.

Ejemplos de código

QRegExp rx("^\\d\\d?$");    // match integers 0 to 99
rx.indexIn("123");          // returns -1 (no match)
rx.indexIn("-6");           // returns -1 (no match)
rx.indexIn("6");            // returns 0 (matched at position 0)

La tercera cadena coincide con'6'. Se trata de una simple regexp de validación para enteros en el rango de 0 a 99.

QRegExp rx("^\\S+$");       // match strings without whitespace
rx.indexIn("Hello world");  // returns -1 (no match)
rx.indexIn("This_is-OK");   // returns 0 (matched at position 0)

La segunda cadena coincide con'This_is-OK'. Hemos utilizado la abreviatura del conjunto de caracteres '\S' (sin espacios en blanco) y las anclas para que coincidan con cadenas que no contienen espacios en blanco.

En el siguiente ejemplo, buscamos cadenas que contengan "mail" o "letter" o "correspondence", pero sólo palabras completas, es decir, no "email".

QRegExp rx("\\b(mail|letter|correspondence)\\b");
rx.indexIn("I sent you an email");     // returns -1 (no match)
rx.indexIn("Please write the letter"); // returns 17

La segunda cadena coincide con "Por favor, escriba la carta". La palabra 'carta' también se captura (debido a los paréntesis). Podemos ver el texto que hemos capturado así:

QString captured = rx.cap(1); // captured == "letter"

Esto capturará el texto del primer conjunto de paréntesis de captura (contando los paréntesis de captura de izquierda a derecha). Los paréntesis se cuentan desde 1 ya que cap(0) es toda la expresión regular coincidente (equivalente a '&' en la mayoría de los motores de expresiones regulares).

QRegExp rx("&(?!amp;)");      // match ampersands but not &amp;
QString line1 = "This & that";
line1.replace(rx, "&amp;");
// line1 == "This &amp; that"
QString line2 = "His &amp; hers & theirs";
line2.replace(rx, "&amp;");
// line2 == "His &amp; hers &amp; theirs"

Aquí hemos pasado la QRegExp a la función replace() de QString para sustituir el texto coincidente por el nuevo texto.

QString str = "One Eric another Eirik, and an Ericsson. "
              "How many Eiriks, Eric?";
QRegExp rx("\\b(Eric|Eirik)\\b"); // match Eric or Eirik
int pos = 0;    // where we are in the string
int count = 0;  // how many Eric and Eirik's we've counted
while (pos >= 0) {
    pos = rx.indexIn(str, pos);
    if (pos >= 0) {
        ++pos;      // move along in str
        ++count;    // count our Eric or Eirik
    }
}

Hemos utilizado la función indexIn() para hacer coincidir repetidamente la regexp en la cadena. Observe que en lugar de avanzar carácter a carácter pos++ podríamos haber escrito pos += rx.matchedLength() para saltarnos la cadena ya coincidente. La cuenta será igual a 3, coincidiendo con 'Un Eric otro Eirik, y un Ericsson. ¿Cuántos Eiriks, Eric?'; no coincide con 'Ericsson' o 'Eiriks' porque no están delimitados por límites no-palabra.

Un uso habitual de las expresiones regulares es dividir líneas de datos delimitadas en los campos que las componen.

str = "The Qt Company Ltd\tqt.io\tFinland";
QString company, web, country;
rx.setPattern("^([^\t]+)\t([^\t]+)\t([^\t]+)$");
if (rx.indexIn(str) != -1) {
    company = rx.cap(1);
    web = rx.cap(2);
    country = rx.cap(3);
}

En este ejemplo, nuestras líneas de entrada tienen el formato nombre de la empresa, dirección web y país. Por desgracia, la expresión regular es bastante larga y poco versátil: el código se romperá si añadimos más campos. Una solución más sencilla y mejor es buscar el separador, '\t' en este caso, y tomar el texto que lo rodea. La función QString::split() puede tomar una cadena separadora o regexp como argumento y dividir una cadena en consecuencia.

QStringList field = str.split("\t");

Aquí campo[0] es la empresa, campo[1] la dirección web y así sucesivamente.

Para imitar la coincidencia de un intérprete de comandos podemos utilizar el modo comodín.

QRegExp rx("*.html");
rx.setPatternSyntax(QRegExp::Wildcard);
rx.exactMatch("index.html");                // returns true
rx.exactMatch("default.htm");               // returns false
rx.exactMatch("readme.txt");                // returns false

Las coincidencias con comodines pueden ser convenientes por su simplicidad, pero cualquier regexp con comodín puede definirse utilizando regexps completos, por ejemplo .*\.html$. Observe que no podemos hacer coincidir los archivos .html y .htm con un comodín a menos que utilicemos *.htm*, que también coincidirá con 'prueba.html.bak'. Una regexp completa nos da la precisión que necesitamos, .*\.html?$.

QRegExp puede hacer coincidir mayúsculas y minúsculas utilizando setCaseSensitivity(), y puede utilizar coincidencias no ávidas, véase setMinimal(). Por defecto, QRegExp utiliza expresiones regulares completas, pero esto puede cambiarse con setPatternSyntax(). La búsqueda puede realizarse hacia delante con indexIn() o hacia atrás con lastIndexIn(). Se puede acceder al texto capturado con capturedTexts(), que devuelve una lista de todas las cadenas capturadas, o con cap(), que devuelve la cadena capturada para el índice dado. La función pos() toma un índice de coincidencia y devuelve la posición en la cadena donde se hizo la coincidencia (o -1 si no hubo coincidencia).

Migración a QRegularExpression

La clase QRegularExpression introducida en Qt 5 implementa expresiones regulares compatibles con Perl y es una gran mejora sobre QRegExp en términos de APIs ofrecidas, sintaxis de patrones soportada y velocidad de ejecución. La mayor diferencia es que QRegularExpression simplemente contiene una expresión regular, y no se modifica cuando se solicita una coincidencia. En su lugar, se devuelve un objeto QRegularExpressionMatch, para comprobar el resultado de una coincidencia y extraer la subcadena capturada. Lo mismo se aplica a las coincidencias globales y a QRegularExpressionMatchIterator.

A continuación se indican otras diferencias.

Nota: QRegularExpression no soporta todas las características disponibles en las expresiones regulares compatibles con Perl. La más notable es el hecho de que los nombres duplicados para capturar grupos no están soportados, y su uso puede llevar a un comportamiento indefinido. Esto puede cambiar en una futura versión de Qt.

Sintaxis de patrones diferente

Portar una expresión regular de QRegExp a QRegularExpression puede requerir cambios en el propio patrón.

En determinados casos, QRegExp era demasiado indulgente y aceptaba patrones que simplemente no eran válidos cuando se utilizaba QRegularExpression. Esto es fácil de detectar, porque los objetos QRegularExpression construidos con estos patrones no son válidos (véase QRegularExpression::isValid()).

En otros casos, un patrón portado de QRegExp a QRegularExpression puede cambiar silenciosamente de semántica. Por lo tanto, es necesario revisar los patrones utilizados. Los casos más notables de incompatibilidad silenciosa son:

  • Se necesitan llaves para utilizar un escape hexadecimal como \xHHHH con más de 2 dígitos. Un patrón como \x2022 necesita ser portado a \x{2022}, o coincidirá con un espacio (0x20) seguido de la cadena "22". En general, se recomienda encarecidamente utilizar siempre llaves con el escape \x, independientemente del número de dígitos especificados.
  • Una cuantificación de 0 a n como {,n} debe pasarse a {0,n} para conservar la semántica. De lo contrario, un patrón como \d{,3} coincidiría con un dígito seguido de la cadena exacta "{,3}".
  • QRegExp realiza por defecto la correspondencia con Unicode, mientras que QRegularExpression requiere una opción aparte; para más detalles, véase más abajo.
  • c{.} en QRegExp coincide por defecto con todos los caracteres, incluido el carácter de nueva línea. QRegularExpression excluye el carácter de nueva línea por defecto. Para incluir el carácter de nueva línea, active la opción de patrón QRegularExpression::DotMatchesEverythingOption.

Para obtener una visión general de la sintaxis de expresiones regulares que admite QRegularExpression, consulte la página de manual pcrepattern(3), en la que se describe la sintaxis de patrones que admite PCRE (la implementación de referencia de expresiones regulares compatibles con Perl).

Adaptación de QRegExp::exactMatch()

QRegExp::exactMatch() servía para dos propósitos: emparejaba exactamente una expresión regular con una cadena de asunto, e implementaba emparejamientos parciales.

Adaptación de la concordancia exacta de QRegExp

La coincidencia exacta indica si la expresión regular coincide con toda la cadena de asunto. Por ejemplo, las clases coinciden con la cadena de asunto "abc123":

QRegExp::exactMatch()QRegularExpressionMatch::hasMatch()
"\\d+"falsoverdadero
"[a-z]+\\d+"verdaderoverdadero

La coincidencia exacta no se refleja en QRegularExpression. Si quiere estar seguro de que la cadena de asunto coincide exactamente con la expresión regular, puede envolver el patrón utilizando la función QRegularExpression::anchoredPattern():

QString p("a .*|pattern");

// re matches exactly the pattern string p
QRegularExpression re(QRegularExpression::anchoredPattern(p));
Adaptación de la concordancia parcial de QRegExp

Cuando se utilizaba QRegExp::exactMatch(), si no se encontraba una coincidencia exacta, se podía averiguar qué parte de la cadena de asunto coincidía con la expresión regular llamando a QRegExp::matchedLength(). Si la longitud devuelta era igual a la longitud de la cadena de asunto, se podía concluir que se había encontrado una coincidencia parcial.

QRegularExpression soporta explícitamente las coincidencias parciales mediante el apropiado QRegularExpression::MatchType.

Coincidencia global

Debido a las limitaciones de la API QRegExp, ha sido imposible implementar correctamente la concordancia global (es decir, como lo hace Perl). En particular, los patrones que pueden coincidir con 0 caracteres (como "a*") son problemáticos.

QRegularExpression::globalMatch() implementa la concordancia global de Perl correctamente, y el iterador devuelto puede utilizarse para examinar cada resultado.

Por ejemplo, si tiene código como

QString subject("the quick fox");

int offset = 0;
QRegExp re("(\\w+)");
while ((offset = re.indexIn(subject, offset)) != -1) {
    offset += re.matchedLength();
    // ...
}

Puedes reescribirlo como:

QString subject("the quick fox");

QRegularExpression re("(\\w+)");
QRegularExpressionMatchIterator i = re.globalMatch(subject);
while (i.hasNext()) {
    QRegularExpressionMatch match = i.next();
    // ...
}
Soporte de propiedades Unicode

Cuando se utiliza QRegExp, las clases de caracteres como \w, \d, etc. coinciden con caracteres con la propiedad Unicode correspondiente: por ejemplo, \d coincide con cualquier carácter con la propiedad Unicode Nd (dígito decimal).

Estas clases de caracteres sólo coinciden por defecto con caracteres ASCII cuando se utiliza QRegularExpression: por ejemplo, \d coincide exactamente con un carácter del rango ASCII 0-9. Es posible cambiar este comportamiento utilizando la opción de patrón QRegularExpression::UseUnicodePropertiesOption.

Coincidencia con comodines

En QRegularExpression no existe una forma directa de hacer coincidencias con comodines. Sin embargo, se proporciona el método QRegularExpression::wildcardToRegularExpression() para traducir patrones glob a una expresión regular compatible con Perl que puede utilizarse con ese fin.

Por ejemplo, si tiene código como

QRegExp wildcard("*.txt");
wildcard.setPatternSyntax(QRegExp::Wildcard);

Puede reescribirlo como:

auto wildcard = QRegularExpression(QRegularExpression::wildcardToRegularExpression("*.txt"));

Tenga en cuenta, sin embargo, que algunos patrones de comodines tipo shell podrían no traducirse a lo que usted espera. El siguiente código de ejemplo se romperá silenciosamente si simplemente se convierte utilizando la función antes mencionada:

const QString fp1("C:/Users/dummy/files/content.txt");
const QString fp2("/home/dummy/files/content.txt");

QRegExp re1("*/files/*");
re1.setPatternSyntax(QRegExp::Wildcard);
re1.exactMatch(fp1); // returns true
re1.exactMatch(fp2); // returns true

// but converted with QRegularExpression::wildcardToRegularExpression()

QRegularExpression re2(QRegularExpression::wildcardToRegularExpression("*/files/*"));
re2.match(fp1).hasMatch(); // returns false
re2.match(fp2).hasMatch(); // returns false

Esto se debe a que, por defecto, la expresión regular devuelta por QRegularExpression::wildcardToRegularExpression() está totalmente anclada. Para obtener una expresión regular que no esté anclada, pase QRegularExpression::UnanchoredWildcardConversion como opciones de conversión:

QRegularExpression re3(QRegularExpression::wildcardToRegularExpression(
                           "*/files/*", QRegularExpression::UnanchoredWildcardConversion));
re3.match(fp1).hasMatch(); // returns true
re3.match(fp2).hasMatch(); // returns true
Coincidencia mínima

QRegExp::setMinimal() implementa la concordancia mínima simplemente invirtiendo la codicia de los cuantificadores (QRegExp no soporta cuantificadores perezosos, como *?, +?, etc.). QRegularExpression en cambio sí soporta cuantificadores codiciosos, perezosos y posesivos. La opción de patrón QRegularExpression::InvertedGreedinessOption puede ser útil para emular los efectos de QRegExp::setMinimal(): si está activada, invierte la codicia de los cuantificadores (los codiciosos se convierten en perezosos y viceversa).

Modos de intercalación

La opción de coincidencia QRegularExpression::AnchorAtOffsetMatchOption puede utilizarse para emular el comportamiento de QRegExp::CaretAtOffset. No hay equivalente para los otros modos de QRegExp::CaretMode.

Véase también QString, QStringList, y QSortFilterProxyModel.

Documentación de tipos de miembros

enum QRegExp::CaretMode

El enum CaretMode define los distintos significados del signo de intercalación(^) en una expresión regular. Los valores posibles son

ConstanteValorDescripción
QRegExp::CaretAtZero0El signo de intercalación corresponde al índice 0 de la cadena buscada.
QRegExp::CaretAtOffset1El signo de intercalación corresponde al inicio de la búsqueda.
QRegExp::CaretWontMatch2El signo de intercalación nunca coincide.

enum QRegExp::PatternSyntax

La sintaxis utilizada para interpretar el significado del patrón.

ConstanteValorDescripción
QRegExp::RegExp0Una rica sintaxis de concordancia de patrones tipo Perl. Es la predeterminada.
QRegExp::RegExp23Como RegExp, pero con greedy quantifiers. (Introducido en Qt 4.2.)
QRegExp::Wildcard1Proporciona una sintaxis simple de concordancia de patrones similar a la utilizada por los shells (intérpretes de comandos) para "file globbing". Véase QRegExp wildcard matching.
QRegExp::WildcardUnix4Es similar a Wildcard pero con el comportamiento de un intérprete de comandos Unix. Los caracteres comodín pueden escaparse con el carácter "\".
QRegExp::FixedString2El patrón es una cadena fija. Esto equivale a utilizar el patrón RegExp en una cadena en la que todos los metacaracteres se escapan utilizando escape().
QRegExp::W3CXmlSchema115El patrón es una expresión regular tal y como se define en la especificación XML Schema 1.1 del W3C.

Véase también setPatternSyntax().

Documentación de las funciones miembro

QRegExp::QRegExp()

Construye una regexp vacía.

Véase también isValid() y errorString().

[explicit] QRegExp::QRegExp(const QString &pattern, Qt::CaseSensitivity cs = Qt::CaseSensitive, QRegExp::PatternSyntax syntax = RegExp)

Construye un objeto de expresión regular para la cadena pattern dada. Si syntax es Wildcard, el patrón debe introducirse en notación comodín; por defecto es RegExp. El patrón distingue entre mayúsculas y minúsculas, a menos que cs sea Qt::CaseInsensitive. La coincidencia es codiciosa (máxima), pero puede cambiarse llamando a setMinimal().

Véase también setPattern(), setCaseSensitivity() y setPatternSyntax().

QRegExp::QRegExp(const QRegExp &rx)

Construye una expresión regular como copia de rx.

Véase también operator=().

[noexcept] QRegExp::~QRegExp()

Destruye la expresión regular y limpia sus datos internos.

QString QRegExp::cap(int nth = 0) const

Devuelve el texto capturado por la subexpresión nth. La coincidencia completa tiene índice 0 y las subexpresiones entre paréntesis tienen índices a partir de 1 (excluyendo los paréntesis no capturadores).

QRegExp rxlen("(\\d+)(?:\\s*)(cm|inch)");
int pos = rxlen.indexIn("Length: 189cm");
if (pos > -1) {
    QString value = rxlen.cap(1); // "189"
    QString unit = rxlen.cap(2);  // "cm"
    // ...
}

El orden de los elementos con los que coincide cap() es el siguiente. El primer elemento, cap(0), es toda la cadena coincidente. Cada elemento subsiguiente corresponde al siguiente paréntesis izquierdo abierto capturador. Así, cap(1) es el texto del primer paréntesis de captura, cap(2) es el texto del segundo, y así sucesivamente.

Véase también capturedTexts() y pos().

int QRegExp::captureCount() const

Devuelve el número de capturas contenidas en la expresión regular.

QStringList QRegExp::capturedTexts() const

Devuelve una lista de las cadenas de texto capturadas.

La primera cadena de la lista es la cadena coincidente completa. Cada elemento posterior de la lista contiene una cadena que coincide con una subexpresión (de captura) de la expresión regular.

Por ejemplo:

QRegExp rx("(\\d+)(\\s*)(cm|inch(es)?)");
int pos = rx.indexIn("Length: 36 inches");
QStringList list = rx.capturedTexts();
// list is now ("36 inches", "36", " ", "inches", "es")

El ejemplo anterior también captura elementos que pueden estar presentes pero que no nos interesan. Este problema puede resolverse utilizando paréntesis no capturadores:

QRegExp rx("(\\d+)(?:\\s*)(cm|inch(?:es)?)");
int pos = rx.indexIn("Length: 36 inches");
QStringList list = rx.capturedTexts();
// list is now ("36 inches", "36", "inches")

Tenga en cuenta que si desea iterar sobre la lista, debe iterar sobre una copia, p. ej.

QStringList list = rx.capturedTexts();
QStringList::iterator it = list.begin();
while (it != list.end()) {
    myProcessing(*it);
    ++it;
}

Algunas expresiones regulares pueden coincidir un número indeterminado de veces. Por ejemplo, si la cadena de entrada es "Offsets: 12 14 99 231 7" y el regexp, rx, es (\d+ )+, esperaríamos obtener una lista de todos los números coincidentes. Sin embargo, después de llamar a rx.indexIn(str), capturedTexts() devolverá la lista ("12", "12"), es decir, la coincidencia completa fue "12" y la primera subexpresión coincidente fue "12". Lo correcto es utilizar cap() en un loop.

El orden de los elementos en la lista de cadenas es el siguiente. El primer elemento es toda la cadena coincidente. Cada elemento subsiguiente corresponde al siguiente paréntesis izquierdo abierto de captura. Así, capturedTexts()[1] es el texto del primer paréntesis de captura, capturedTexts()[2] es el texto del segundo y así sucesivamente (correspondientes a $1, $2, etc., en algunos otros lenguajes regexp).

Véase también cap() y pos().

Qt::CaseSensitivity QRegExp::caseSensitivity() const

Devuelve Qt::CaseSensitive si se distingue entre mayúsculas y minúsculas; en caso contrario, devuelve Qt::CaseInsensitive.

Véase también setCaseSensitivity(), patternSyntax(), pattern() y isMinimal().

int QRegExp::countIn(const QString &str) const

Devuelve el número de veces que coincide esta expresión regular en str.

Véase también indexIn(), lastIndexIn() y replaceIn().

QString QRegExp::errorString() const

Devuelve una cadena de texto que explica por qué un patrón regexp no es válido siendo el caso; en caso contrario devuelve "no se ha producido ningún error".

Véase también isValid().

[static] QString QRegExp::escape(const QString &str)

Devuelve la cadena str con cada carácter especial regexp escapado con una barra invertida. Los caracteres especiales son $, (,), *, +, ., ?, [, ,], ^, {, | y }.

Ejemplo:

s1 = QRegExp::escape("bingo");   // s1 == "bingo"
s2 = QRegExp::escape("f(x)");    // s2 == "f\\(x\\)"

Esta función es útil para construir patrones regexp dinámicamente:

QRegExp rx("(" + QRegExp::escape(name) +
           "|" + QRegExp::escape(alias) + ")");

Véase también setPatternSyntax().

bool QRegExp::exactMatch(const QString &str) const

Devuelve true si str coincide exactamente con esta expresión regular; en caso contrario devuelve false. Puede determinar qué parte de la cadena coincidió llamando a matchedLength().

Para una cadena regexp dada R, exactMatch("R") es el equivalente de indexIn("^R$") ya que exactMatch() encierra efectivamente la regexp en las anclas de inicio de cadena y fin de cadena, excepto que establece matchedLength() de forma diferente.

Por ejemplo, si la expresión regular es azul, entonces exactMatch() devuelve true sólo para la entrada blue. Para las entradas bluebell, blutak y lightblue, exactMatch() devuelve false y matchedLength() devolverá 4, 3 y 0 respectivamente.

Aunque es constante, esta función establece matchedLength(), capturedTexts() y pos().

Véase también indexIn() y lastIndexIn().

QStringList QRegExp::filterList(const QStringList &stringList) const

Devuelve una lista de todas las cadenas que coinciden con esta expresión regular en stringList.

int QRegExp::indexIn(const QStringList &list, int from) const

Devuelve la posición del índice de la primera coincidencia exacta de esta regexp en list, buscando hacia adelante desde la posición del índice from. Devuelve -1 si no hay ninguna coincidencia.

Véase también lastIndexIn() y exactMatch().

int QRegExp::indexIn(const QString &str, int offset = 0, QRegExp::CaretMode caretMode = CaretAtZero) const

Intenta encontrar una coincidencia en str a partir de la posición offset (0 por defecto). Si offset es -1, la búsqueda comienza en el último carácter; si es -2, en el penúltimo carácter; etc.

Devuelve la posición de la primera coincidencia, o -1 si no hubo coincidencia.

El parámetro caretMode puede utilizarse para indicar si ^ debe buscar en el índice 0 o en offset.

Puede que prefiera utilizar QString::indexOf(), QString::contains(), o incluso QStringList::filter(). Para reemplazar coincidencias utilice QString::replace().

Ejemplo:

QString str = "offsets: 1.23 .50 71.00 6.00";
QRegExp rx("\\d*\\.\\d+");    // primitive floating point matching
int count = 0;
int pos = 0;
while ((pos = rx.indexIn(str, pos)) != -1) {
    ++count;
    pos += rx.matchedLength();
}
// pos will be 9, 14, 18 and finally 24; count will end up as 4

Aunque es constante, esta función establece matchedLength(), capturedTexts() y pos().

Si QRegExp es una expresión comodín (consulte setPatternSyntax()) y desea comprobar una cadena con la expresión comodín completa, utilice exactMatch() en lugar de esta función.

Véase también lastIndexIn() y exactMatch().

bool QRegExp::isEmpty() const

Devuelve true si la cadena del patrón está vacía; en caso contrario devuelve false.

Si llama a exactMatch() con un patrón vacío sobre una cadena vacía devolverá true; en caso contrario devuelve false ya que opera sobre toda la cadena. Si llama a indexIn() con un patrón vacío sobre cualquier cadena devolverá el desplazamiento de inicio (0 por defecto) porque el patrón vacío coincide con el 'vacío' del inicio de la cadena. En este caso, la longitud de la coincidencia devuelta por matchedLength() será 0.

Véase QString::isEmpty().

bool QRegExp::isMinimal() const

Devuelve true si está activada la concordancia mínima (no codiciosa); en caso contrario, devuelve false.

Véase también caseSensitivity() y setMinimal().

bool QRegExp::isValid() const

Devuelve true si la expresión regular es válida; en caso contrario, devuelve false. Una expresión regular inválida nunca coincide.

El patrón [a-z es un ejemplo de patrón inválido, ya que carece de corchete de cierre.

Tenga en cuenta que la validez de una expresión regular también puede depender de la configuración del indicador de comodín, por ejemplo *.html es una expresión regular con comodín válida pero una expresión regular completa no válida.

Véase también errorString().

int QRegExp::lastIndexIn(const QStringList &list, int from) const

Devuelve la posición del índice de la última coincidencia exacta de esta regexp en list, buscando hacia atrás desde la posición del índice from. Si from es -1 (por defecto), la búsqueda comienza en el último elemento. Devuelve -1 si no hay coincidencias.

Véase también QRegExp::exactMatch().

int QRegExp::lastIndexIn(const QString &str, int offset = -1, QRegExp::CaretMode caretMode = CaretAtZero) const

Intenta encontrar una coincidencia hacia atrás en str desde la posición offset. Si offset es -1 (por defecto), la búsqueda comienza en el último carácter; si es -2, en el penúltimo carácter; etc.

Devuelve la posición de la primera coincidencia, o -1 si no hubo coincidencia.

El parámetro caretMode puede utilizarse para indicar si ^ debe coincidir en el índice 0 o en offset.

Aunque es constante, esta función establece matchedLength(), capturedTexts() y pos().

Advertencia: La búsqueda hacia atrás es mucho más lenta que la búsqueda hacia delante.

Véase también indexIn() y exactMatch().

int QRegExp::matchedLength() const

Devuelve la longitud de la última cadena coincidente, o -1 si no hubo coincidencia.

Véase también exactMatch(), indexIn() y lastIndexIn().

QString QRegExp::pattern() const

Devuelve la cadena del patrón de la expresión regular. El patrón tiene sintaxis de expresión regular o sintaxis de comodín, dependiendo de patternSyntax().

Véase también setPattern(), patternSyntax() y caseSensitivity().

QRegExp::PatternSyntax QRegExp::patternSyntax() const

Devuelve la sintaxis utilizada por la expresión regular. El valor por defecto es QRegExp::RegExp.

Véase también setPatternSyntax(), pattern() y caseSensitivity().

int QRegExp::pos(int nth = 0) const

Devuelve la posición del texto capturado nth en la cadena buscada. Si nth es 0 (por defecto), pos() devuelve la posición de toda la coincidencia.

Ejemplo:

QRegExp rx("/([a-z]+)/([a-z]+)");
rx.indexIn("Output /dev/null");   // returns 7 (position of /dev/null)
rx.pos(0);                        // returns 7 (position of /dev/null)
rx.pos(1);                        // returns 8 (position of dev)
rx.pos(2);                        // returns 12 (position of null)

Para coincidencias de longitud cero, pos() siempre devuelve -1. (Por ejemplo, si cap(4) devolvería una cadena vacía, pos(4) devuelve -1.) Se trata de una característica de la implementación.

Véase también cap() y capturedTexts().

QString QRegExp::removeIn(const QString &str) const

Elimina cada ocurrencia de esta expresión regular str, y devuelve el resultado.

Hace lo mismo que replaceIn(str, QString()).

Véase también indexIn(), lastIndexIn() y replaceIn().

QString QRegExp::replaceIn(const QString &str, const QString &after) const

Sustituye cada aparición de esta expresión regular en str por after y devuelve el resultado.

Para expresiones regulares que contengan capturing parentheses, las apariciones de \1, \2..., en after se sustituyen por rx.cap(1), cap(2), ...

Véase también indexIn(), lastIndexIn() y QRegExp::cap().

QStringList QRegExp::replaceIn(const QStringList &stringList, const QString &after) const

Reemplaza cada aparición de esta regexp, en cada uno de stringList's con after. Devuelve una referencia a la lista de cadenas.

void QRegExp::setCaseSensitivity(Qt::CaseSensitivity cs)

Establece la coincidencia entre mayúsculas y minúsculas en cs.

Si cs es Qt::CaseSensitive, \ .txt$ coincide con readme.txt pero no con README.TXT.

Véase también caseSensitivity(), setPatternSyntax(), setPattern() y setMinimal().

void QRegExp::setMinimal(bool minimal)

Activa o desactiva la coincidencia mínima. Si minimal es falso, la coincidencia es codiciosa (máxima), que es el valor predeterminado.

Por ejemplo, supongamos que tenemos la cadena de entrada "Debemos ser <b>negros</b>, ¡muy <b>negros</b>!" y el patrón <b>.*</b>. Con la coincidencia codiciosa (máxima) por defecto, la coincidencia es "Debemos ser <b>negros</b>, ¡muy <b>negros</b>!". Pero con la concordancia mínima (no codiciosa), la primera concordancia es: "¡Debemos ser <b>negrita</b>, muy <b>negrita</b>!" y la segunda coincidencia es "¡Debemos ser <b>negrita</b>, muy <b>negrita</b>!". En la práctica podríamos utilizar el patrón <b>[^<]*</b> en su lugar, aunque esto seguirá fallando para las etiquetas anidadas.

Véase también isMinimal() y setCaseSensitivity().

void QRegExp::setPattern(const QString &pattern)

Establece la cadena del patrón en pattern. Las opciones de distinción entre mayúsculas y minúsculas, comodín y coincidencia mínima no se modifican.

Véase también pattern(), setPatternSyntax() y setCaseSensitivity().

void QRegExp::setPatternSyntax(QRegExp::PatternSyntax syntax)

Establece el modo de sintaxis para la expresión regular. Por defecto es QRegExp::RegExp.

Si se define syntax como QRegExp::Wildcard, se habilita el modo shell QRegExp wildcard matching. Por ejemplo, r*.txt coincide con la cadena readme.txt en modo comodín, pero no coincide con readme.

Si se define syntax como QRegExp::FixedString, el patrón se interpreta como una cadena sin formato. Los caracteres especiales (por ejemplo, la barra invertida) no necesitan escaparse.

Véase también patternSyntax(), setPattern(), setCaseSensitivity() y escape().

QStringList QRegExp::splitString(const QString &str, Qt::SplitBehavior behavior = Qt::KeepEmptyParts) const

Divide str en subcadenas siempre que coincida esta expresión regular, y devuelve la lista de esas cadenas. Si esta expresión regular no coincide en ninguna parte de la cadena, split() devuelve una lista de un solo elemento que contiene str.

Si behavior se establece en Qt::KeepEmptyParts, los campos vacíos se incluyen en la lista resultante.

Véase también QStringList::join() y QString::split().

[noexcept] void QRegExp::swap(QRegExp &other)

Intercambia la expresión regular other con esta expresión regular. Esta operación es muy rápida y nunca falla.

QRegExp::operator QVariant() const

Devuelve la expresión regular como QVariant

bool QRegExp::operator!=(const QRegExp &rx) const

Devuelve true si esta expresión regular no es igual a rx; en caso contrario devuelve false.

Véase también operator==().

[noexcept] QRegExp &QRegExp::operator=(QRegExp &&other)

Mover-asigna other a esta instancia QRegExp.

QRegExp &QRegExp::operator=(const QRegExp &rx)

Copia la expresión regular rx y devuelve una referencia a la copia. También se copian las opciones de distinción entre mayúsculas y minúsculas, comodín y coincidencia mínima.

bool QRegExp::operator==(const QRegExp &rx) const

Devuelve true si esta expresión regular es igual a rx; en caso contrario devuelve false.

Dos objetos QRegExp son iguales si tienen las mismas cadenas de patrones y la misma configuración para la distinción entre mayúsculas y minúsculas, comodines y coincidencia mínima.

No miembros relacionados

[noexcept] size_t qHash(const QRegExp &key, size_t seed = 0)

Devuelve el valor hash para key, utilizando seed para sembrar el cálculo.

QDataStream &operator<<(QDataStream &out, const QRegExp &regExp)

Escribe la expresión regular regExp en el flujo out.

Ver también Serializar tipos de datos Qt.

QDataStream &operator>>(QDataStream &in, QRegExp &regExp)

Lee una expresión regular del flujo in en regExp.

Véase también Serializar tipos de datos Qt.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.