Cuantificadores
Actualización: Julio de 2008
Los cuantificadores especifican cuántas instancias del elemento anterior (que puede ser un carácter, un grupo o una clase de caracteres) debe haber en la entrada para que se encuentre una coincidencia.
Cuantificadores en expresiones regulares de .NET Framework
En la tabla siguiente se enumeran los cuantificadores admitidos en las expresiones regulares de .NET Framework. Las cantidades n y m son constantes de tipo entero. En la sección "Cuantificaciones expansivos y no expansivos" que sigue a la tabla, encontrará una descripción de las diferencias que existen entre los dos tipos de cuantificadores.
Cuantificador |
Descripción |
---|---|
* |
Coincide con el elemento anterior cero o más veces. Es equivalente a {0,}. * es un cuantificador expansivo cuyo equivalente no expansivo es *?. Por ejemplo, la expresión regular \b91*9*\b intenta encontrar una coincidencia del dígito 9 después de un límite de palabra. 9 puede ir seguido de cero o varias instancias del dígito 1, que, a su vez, puede ir seguido por cero o más instancias del dígito 9. En el siguiente ejemplo se muestra esta expresión regular. De los nueve dígitos de la cadena de entrada, cinco coinciden con el modelo y cuatro, (95, 929, 9129 y 9919) no.
|
+ |
Coincide con el elemento anterior una o más veces. Es equivalente a {1,}. + es un cuantificador expansivo cuyo equivalente no expansivo es +?. Por ejemplo, la expresión regular \ba(n)+\w*?\b intenta encontrar coincidencias de palabras enteras que comienzan con la letra a seguida de una o varias instancias de la letra n. En el siguiente ejemplo se muestra esta expresión regular. La expresión regular coincide con las palabras an, annual, announcement y antique y, como cabía esperar, no coincide con autumn ni con all.
|
? |
Coincide con el elemento anterior cero o una vez. Es equivalente a {0,1}. ? es un cuantificador expansivo cuyo equivalente no expansivo es ??. Por ejemplo, la expresión regular \ban?\b intenta encontrar coincidencias de palabras enteras que comienzan con la letra a seguida de cero o una instancia de la letra n. En otras palabras, intenta buscar coincidencias con las palabras a y an. En el siguiente ejemplo se muestra esta expresión regular.
|
{n} |
Coincide con el elemento anterior exactamente n veces. {n} es un cuantificador expansivo cuyo equivalente no expansivo es {n}?. Por ejemplo, la expresión regular \b\d+\,\d{3}\b intenta encontrar coincidencias de un límite de palabra seguido de uno o varios dígitos decimales, que, a su vez, van seguidos por tres dígitos decimales seguidos por un límite de palabra. En el siguiente ejemplo se muestra esta expresión regular.
|
{n,} |
Coincide con el elemento anterior al menos n veces. {n,} es un cuantificador expansivo cuyo equivalente no expansivo es {n}?. Por ejemplo, la expresión regular \b\d{2,}\b\D+ intenta encontrar coincidencias con un límite de palabra seguido por lo menos de dos dígitos, que, a su vez, van seguidos de un límite de palabra y un carácter no numérico. En el siguiente ejemplo se muestra esta expresión regular. La expresión regular no coincide con la frase 7 days porque solo contiene un dígito decimal, pero coincide correctamente con las frases 10 weeks y 300 years.
|
{n,m} |
Coincide con el elemento anterior al menos n veces, pero no más de m veces. {n,m} es un cuantificador expansivo cuyo equivalente no expansivo es {n,m}?. Por ejemplo, la expresión regular (00\s){2,4} intenta encontrar coincidencias entre dos y cuatro ocurrencias de dos ceros seguidos de un espacio. En el siguiente ejemplo se muestra esta expresión regular. Observe que la parte final de la cadena de entrada incluye este modelo cinco veces en lugar del máximo de cuatro. Sin embargo, la parte inicial de esta subcadena (hasta el espacio y el quinto par de ceros) coincide con el modelo de la expresión regular.
|
*? |
Coincide con el elemento anterior cero o más veces, pero el menor número de veces que sea posible. Se trata de un cuantificador no expansivo, que es el equivalente del cuantificador expansivo *. Por ejemplo, las expresiones regulares \b\w*?oo\w*?\b coinciden con todas las palabras que contienen oo. En el siguiente ejemplo se muestra esta expresión regular.
|
+? |
Coincide con el elemento anterior una o más veces, pero el menor número de veces que sea posible. Se trata de un cuantificador no expansivo, que es el equivalente del cuantificador expansivo +. Por ejemplo, la expresión regular \b\w+?\b coincide con uno o varios caracteres separados por límites de palabra. En el siguiente ejemplo se muestra esta expresión regular.
|
?? |
Coincide con el elemento anterior cero o una vez, pero el menor número de veces que sea posible. Se trata de un cuantificador no expansivo, que es el equivalente del cuantificador expansivo ?. Por ejemplo, la expresión regular ^(\s)*(System.)??Console.Write(Line)??\(?? intenta encontrar coincidencias con las cadenas Console.Write o Console.WriteLine. La cadena también puede incluir System. antes que Console y puede ir seguida de un paréntesis de apertura. La cadena debe estar al comienzo de una línea, aunque puede ir precedida de un espacio en blanco. En el siguiente ejemplo se muestra esta expresión regular.
|
{n}? |
Coincide con el elemento anterior exactamente n veces. Se trata de un cuantificador no expansivo, que es el equivalente del cuantificador expansivo {n}+. Por ejemplo, la expresión regular \b(\w{3,}?\.){2}?\w{3,}?\b coincide exactamente con dos conjuntos de caracteres seguidos de un punto en un límite de palabra. A continuación, le sigue otro conjunto de caracteres y un límite de palabra. Esta expresión regular debería identificar la dirección de un sitio web. En el siguiente ejemplo se muestra la expresión regular. Observe que coincide con www.microsoft.com y mdsn.microsoft.com, pero no coincide con mywebsite ni con mycompany.com.
|
{n,}? |
Coincide con el elemento anterior por lo menos n veces, pero el menor número de veces posible. Se trata de un cuantificador no expansivo, que es el equivalente del cuantificador expansivo {n,}. Vea el ejemplo del cuantificador {n}? como demostración. La expresión regular de ese ejemplo utiliza el cuantificador {n,} para buscar coincidencias con una cadena que tenga al menos tres caracteres seguidos de un punto. |
{n,m}? |
Coincide con el elemento anterior entre n y m veces, pero el menor número de veces posible. Se trata de un cuantificador no expansivo, que es el equivalente del cuantificador expansivo {n,m}. Por ejemplo, la expresión regular \b[A-Z](\w*?\s*?){1,10}[.!?] busca coincidencias con frases que contengan entre una y diez palabras. Coincide con un límite de palabra seguido de una letra mayúscula que, a su vez, va seguida de entre una y diez repeticiones de cero o más caracteres alfabéticos y, opcionalmente, de un carácter de espacio en blanco. La coincidencia, a continuación, finaliza con un punto, un signo de exclamación o un signo de interrogación. En el siguiente ejemplo se muestra esta expresión regular. Coincide con todas las frases de la cadena de entrada a excepción de una única frase, que contiene 18 palabras.
|
Cuantificadores expansivos y no expansivos
Hay varios cuantificadores que tienen dos versiones:
Una versión expansiva.
Un cuantificador expansivo intenta buscar coincidencias con el elemento al que se aplica tantas veces como sea posible.
Una versión no expansiva.
Un cuantificador no expansivo intenta buscar coincidencias con el elemento al que se aplica el menor número de veces posible.
Para mostrar la diferencia, considere una expresión regular muy simple con la que se pretende extraer los cuatro últimos dígitos de una cadena de números como los de una tarjeta de crédito. La versión de la expresión regular que utiliza el cuantificador * expansivo es \b.*([0-9]{4})\b. Sin embargo, en una cadena que contenga dos números, encontrará coincidencias al mostrar únicamente los cuatro últimos dígitos del segundo número, tal y como se muestra en el ejemplo siguiente.
Dim greedyPattern As String = "\b.*([0-9]{4})\b"
Dim input1 As String = "1112223333 3992991999"
For Each match As Match In Regex.Matches(input1, greedypattern)
Console.WriteLine("Account ending in ******{0}.", match.Groups(1).Value)
Next
' The example displays the following output:
' Account ending in ******1999.
string greedyPattern = @"\b.*([0-9]{4})\b";
string input1 = "1112223333 3992991999";
foreach (Match match in Regex.Matches(input1, greedyPattern))
Console.WriteLine("Account ending in ******{0}.", match.Groups[1].Value);
// The example displays the following output:
// Account ending in ******1999.
Éste no es el comportamiento deseado. La expresión regular no coincide con el primer número porque el cuantificador * intenta buscar coincidencias con el elemento anterior tantas veces como sea posible en toda la cadena y, por tanto, encuentra su coincidencia al final de la cadena.
Sin embargo, una expresión regular equivalente que utilice el cuantificador no expansivo *? tendría el comportamiento esperado, tal y como se muestra en el ejemplo siguiente.
Dim lazyPattern As String = "\b.*?([0-9]{4})\b"
Dim input2 As String = "1112223333 3992991999"
For Each match As Match In Regex.Matches(input2, lazypattern)
Console.WriteLine("Account ending in ******{0}.", match.Groups(1).Value)
Next
' The example displays the following output:
' Account ending in ******3333.
' Account ending in ******1999.
string lazyPattern = @"\b.*?([0-9]{4})\b";
string input2 = "1112223333 3992991999";
foreach (Match match in Regex.Matches(input2, lazyPattern))
Console.WriteLine("Account ending in ******{0}.", match.Groups[1].Value);
// The example displays the following output:
// Account ending in ******3333.
// Account ending in ******1999.
En la mayoría de los casos, las expresiones regulares con cuantificadores expansivos y no expansivos devuelven las mismas coincidencias. La mayor parte de las veces, devuelven resultados diferentes cuando se utilizan con un punto (metacarácter .), que coincide con cualquier carácter.
Vea también
Otros recursos
Elementos del lenguaje de expresiones regulares
Historial de cambios
Fecha |
Historial |
Motivo |
---|---|---|
Julio de 2008 |
Revisado exhaustivamente. |
Corrección de errores de contenido. |