Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Las expresiones regulares proporcionan un método eficaz, flexible y eficaz para procesar texto. La notación extensa de coincidencia de patrones de expresiones regulares permite analizar rápidamente grandes cantidades de texto para lo siguiente:
- Buscar patrones de caracteres específicos.
- Validar el texto para asegurarse de que coincida con un patrón predefinido (por ejemplo, una dirección de correo electrónico).
- Extraer, editar, reemplazar o eliminar subcadenas de texto.
- Agregue cadenas extraídas a una colección para generar un informe.
Para muchas aplicaciones que tratan cadenas o que analizan bloques grandes de texto, las expresiones regulares son una herramienta indispensable.
Funcionamiento de las expresiones regulares
La pieza central del procesamiento de texto con expresiones regulares es el motor de expresiones regulares, que se representa mediante el System.Text.RegularExpressions.Regex objeto en .NET. Como mínimo, el procesamiento de texto mediante expresiones regulares requiere que el motor de expresiones regulares se proporcione con los dos elementos de información siguientes:
Patrón de expresión regular para identificar en el texto.
En .NET, los patrones de expresiones regulares se definen mediante una sintaxis o lenguaje especial, que es compatible con expresiones regulares de Perl 5 y agrega algunas características adicionales, como la coincidencia de derecha a izquierda. Para obtener más información, vea Lenguaje de expresiones regulares: referencia rápida.
El texto que se debe analizar para el patrón de expresión regular.
Los métodos de la Regex clase permiten realizar las siguientes operaciones:
Determine si el patrón de expresión regular se produce en el texto de entrada llamando al Regex.IsMatch método . Para obtener un ejemplo que usa el IsMatch método para validar texto, vea Cómo: Comprobar que las cadenas están en formato de correo electrónico válido.
Recupere una o todas las apariciones de texto que coincidan con el patrón de expresión regular llamando al método Regex.Match o Regex.Matches. El método anterior devuelve un System.Text.RegularExpressions.Match objeto que proporciona información sobre el texto coincidente. Este último devuelve un MatchCollection objeto que contiene un System.Text.RegularExpressions.Match objeto para cada coincidencia encontrada en el texto analizado.
Reemplace el texto que coincide con el patrón de expresión regular llamando al Regex.Replace método . Para obtener ejemplos que usan el Replace método para cambiar formatos de fecha y quitar caracteres no válidos de una cadena, vea Cómo: Quitar caracteres no válidos de una cadena y ejemplo: Cambiar formatos de fecha.
Para obtener información general sobre el modelo de objetos de expresión regular, vea El modelo de objetos de expresión regular.
Para obtener más información sobre el lenguaje de expresiones regulares, vea Lenguaje de expresiones regulares: Referencia rápida o descarga e imprime uno de los folletos siguientes:
Ejemplos de expresiones regulares
La String clase incluye métodos de búsqueda y reemplazo de cadenas que puede usar cuando quiera buscar cadenas literales en una cadena mayor. Las expresiones regulares son más útiles cuando se quiere buscar una de varias subcadenas en una cadena más grande o cuando se desea identificar patrones en una cadena, como se muestra en los ejemplos siguientes.
Advertencia
Cuando se usa System.Text.RegularExpressions para procesar entradas que no son de confianza, pase un tiempo de expiración. Un usuario malintencionado puede proporcionar una entrada a RegularExpressions
, lo que provoca un ataque por denegación de servicio. Las API del marco ASP.NET Core en las que se usa RegularExpressions
pasan un tiempo de expiración.
Sugerencia
El System.Web.RegularExpressions espacio de nombres contiene una serie de objetos de expresión regular que implementan patrones de expresiones regulares predefinidos para analizar cadenas de documentos HTML, XML y ASP.NET. Por ejemplo, la TagRegex clase identifica etiquetas de inicio en una cadena y la CommentRegex clase identifica ASP.NET comentarios en una cadena.
Ejemplo 1: Reemplazo de subcadenas
Supongamos que una lista de correo contiene nombres que a veces incluyen un título (Sr., Sra., Señorita o Ms.) junto con un nombre y apellidos. Supongamos que no desea incluir los títulos al generar etiquetas de sobres desde la lista. En ese caso, puede usar una expresión regular para quitar los títulos, como se muestra en el ejemplo siguiente:
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = "(Mr\\.? |Mrs\\.? |Miss |Ms\\.? )";
string[] names = { "Mr. Henry Hunt", "Ms. Sara Samuels",
"Abraham Adams", "Ms. Nicole Norris" };
foreach (string name in names)
Console.WriteLine(Regex.Replace(name, pattern, String.Empty));
}
}
// The example displays the following output:
// Henry Hunt
// Sara Samuels
// Abraham Adams
// Nicole Norris
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
Dim pattern As String = "(Mr\.? |Mrs\.? |Miss |Ms\.? )"
Dim names() As String = {"Mr. Henry Hunt", "Ms. Sara Samuels", _
"Abraham Adams", "Ms. Nicole Norris"}
For Each name As String In names
Console.WriteLine(Regex.Replace(name, pattern, String.Empty))
Next
End Sub
End Module
' The example displays the following output:
' Henry Hunt
' Sara Samuels
' Abraham Adams
' Nicole Norris
El patrón de expresión regular (Mr\.? |Mrs\.? |Miss |Ms\.? )
busca coincidencias con cualquier aparición de "Mr", "Mr.", "Mrs", "Mrs.", "Miss", "Ms" o "Ms.". La llamada al Regex.Replace método reemplaza la cadena coincidente por String.Empty; es decir, la quita de la cadena original.
Ejemplo 2: Identificación de palabras duplicadas
La duplicación accidental de palabras es un error común que hacen los escritores. Use una expresión regular para identificar palabras duplicadas, como se muestra en el ejemplo siguiente:
using System;
using System.Text.RegularExpressions;
public class Class1
{
public static void Main()
{
string pattern = @"\b(\w+?)\s\1\b";
string input = "This this is a nice day. What about this? This tastes good. I saw a a dog.";
foreach (Match match in Regex.Matches(input, pattern, RegexOptions.IgnoreCase))
Console.WriteLine($"{match.Value} (duplicates '{match.Groups[1].Value}') at position {match.Index}");
}
}
// The example displays the following output:
// This this (duplicates 'This') at position 0
// a a (duplicates 'a') at position 66
Imports System.Text.RegularExpressions
Module modMain
Public Sub Main()
Dim pattern As String = "\b(\w+?)\s\1\b"
Dim input As String = "This this is a nice day. What about this? This tastes good. I saw a a dog."
For Each match As Match In Regex.Matches(input, pattern, RegexOptions.IgnoreCase)
Console.WriteLine("{0} (duplicates '{1}') at position {2}", _
match.Value, match.Groups(1).Value, match.Index)
Next
End Sub
End Module
' The example displays the following output:
' This this (duplicates 'This') at position 0
' a a (duplicates 'a') at position 66
El patrón \b(\w+?)\s\1\b
de expresión regular se puede interpretar de la siguiente manera:
Modelo | Interpretación |
---|---|
\b |
Empieza en un límite de palabras. |
(\w+?) |
Coincide con uno o más caracteres de palabra, pero con el menor número de caracteres posible. Juntos, forman un grupo al que se puede hacer referencia como \1 . |
\s |
Coincide con un carácter de espacio en blanco. |
\1 |
Encuentra la subcadena que es igual al grupo denominado \1 . |
\b |
Coincide con un límite de palabras. |
Se llama al método Regex.Matches con las opciones de expresión regular configuradas en RegexOptions.IgnoreCase. Por tanto, la operación de coincidencia no distingue mayúsculas de minúsculas y el ejemplo identifica la subcadena "Esto esto" como una duplicación.
La cadena de entrada incluye la subcadena "this? Esto". Sin embargo, debido al signo de puntuación intermedio, no se identifica como una duplicación.
Ejemplo 3: Crear dinámicamente una expresión regular sensible a la cultura
En el ejemplo siguiente se muestra la potencia de las expresiones regulares combinadas con la flexibilidad que ofrecen las características de globalización de .NET. Usa el objeto NumberFormatInfo para determinar el formato de los valores de moneda en la cultura actual del sistema. A continuación, usa esa información para construir dinámicamente una expresión regular que extrae valores de moneda del texto. Para cada coincidencia, extrae el subgrupo que contiene solo la cadena numérica, la convierte en un valor de Decimal y calcula un total acumulado.
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
// Define text to be parsed.
string input = "Office expenses on 2/13/2008:\n" +
"Paper (500 sheets) $3.95\n" +
"Pencils (box of 10) $1.00\n" +
"Pens (box of 10) $4.49\n" +
"Erasers $2.19\n" +
"Ink jet printer $69.95\n\n" +
"Total Expenses $ 81.58\n";
// Get current culture's NumberFormatInfo object.
NumberFormatInfo nfi = CultureInfo.CurrentCulture.NumberFormat;
// Assign needed property values to variables.
string currencySymbol = nfi.CurrencySymbol;
bool symbolPrecedesIfPositive = nfi.CurrencyPositivePattern % 2 == 0;
string groupSeparator = nfi.CurrencyGroupSeparator;
string decimalSeparator = nfi.CurrencyDecimalSeparator;
// Form regular expression pattern.
string pattern = Regex.Escape( symbolPrecedesIfPositive ? currencySymbol : "") +
@"\s*[-+]?" + "([0-9]{0,3}(" + groupSeparator + "[0-9]{3})*(" +
Regex.Escape(decimalSeparator) + "[0-9]+)?)" +
(! symbolPrecedesIfPositive ? currencySymbol : "");
Console.WriteLine( "The regular expression pattern is:");
Console.WriteLine(" " + pattern);
// Get text that matches regular expression pattern.
MatchCollection matches = Regex.Matches(input, pattern,
RegexOptions.IgnorePatternWhitespace);
Console.WriteLine($"Found {matches.Count} matches.");
// Get numeric string, convert it to a value, and add it to List object.
List<decimal> expenses = new List<Decimal>();
foreach (Match match in matches)
expenses.Add(Decimal.Parse(match.Groups[1].Value));
// Determine whether total is present and if present, whether it is correct.
decimal total = 0;
foreach (decimal value in expenses)
total += value;
if (total / 2 == expenses[expenses.Count - 1])
Console.WriteLine($"The expenses total {expenses[expenses.Count - 1]:C2}.");
else
Console.WriteLine($"The expenses total {total:C2}.");
}
}
// The example displays the following output:
// The regular expression pattern is:
// \$\s*[-+]?([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?)
// Found 6 matches.
// The expenses total $81.58.
Imports System.Collections.Generic
Imports System.Globalization
Imports System.Text.RegularExpressions
Public Module Example
Public Sub Main()
' Define text to be parsed.
Dim input As String = "Office expenses on 2/13/2008:" + vbCrLf + _
"Paper (500 sheets) $3.95" + vbCrLf + _
"Pencils (box of 10) $1.00" + vbCrLf + _
"Pens (box of 10) $4.49" + vbCrLf + _
"Erasers $2.19" + vbCrLf + _
"Ink jet printer $69.95" + vbCrLf + vbCrLf + _
"Total Expenses $ 81.58" + vbCrLf
' Get current culture's NumberFormatInfo object.
Dim nfi As NumberFormatInfo = CultureInfo.CurrentCulture.NumberFormat
' Assign needed property values to variables.
Dim currencySymbol As String = nfi.CurrencySymbol
Dim symbolPrecedesIfPositive As Boolean = CBool(nfi.CurrencyPositivePattern Mod 2 = 0)
Dim groupSeparator As String = nfi.CurrencyGroupSeparator
Dim decimalSeparator As String = nfi.CurrencyDecimalSeparator
' Form regular expression pattern.
Dim pattern As String = Regex.Escape(CStr(IIf(symbolPrecedesIfPositive, currencySymbol, ""))) + _
"\s*[-+]?" + "([0-9]{0,3}(" + groupSeparator + "[0-9]{3})*(" + _
Regex.Escape(decimalSeparator) + "[0-9]+)?)" + _
CStr(IIf(Not symbolPrecedesIfPositive, currencySymbol, ""))
Console.WriteLine("The regular expression pattern is: ")
Console.WriteLine(" " + pattern)
' Get text that matches regular expression pattern.
Dim matches As MatchCollection = Regex.Matches(input, pattern, RegexOptions.IgnorePatternWhitespace)
Console.WriteLine("Found {0} matches. ", matches.Count)
' Get numeric string, convert it to a value, and add it to List object.
Dim expenses As New List(Of Decimal)
For Each match As Match In matches
expenses.Add(Decimal.Parse(match.Groups.Item(1).Value))
Next
' Determine whether total is present and if present, whether it is correct.
Dim total As Decimal
For Each value As Decimal In expenses
total += value
Next
If total / 2 = expenses(expenses.Count - 1) Then
Console.WriteLine("The expenses total {0:C2}.", expenses(expenses.Count - 1))
Else
Console.WriteLine("The expenses total {0:C2}.", total)
End If
End Sub
End Module
' The example displays the following output:
' The regular expression pattern is:
' \$\s*[-+]?([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?)
' Found 6 matches.
' The expenses total $81.58.
En un equipo cuya referencia cultural actual sea Inglés - Estados Unidos (en-US), el ejemplo crea dinámicamente la expresión regular \$\s*[-+]?([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?)
. Este patrón de expresión regular se puede interpretar de la siguiente manera:
Modelo | Interpretación |
---|---|
\$ |
Busque una sola aparición del símbolo de dólar ($ ) en la cadena de entrada. La cadena del patrón de expresión regular incluye una barra diagonal inversa para indicar que el símbolo de dólar debe interpretarse literalmente en lugar de interpretarse como un delimitador de la expresión regular. Si solo apareciese el símbolo $ , esto indicaría que el motor de expresión regular debe intentar iniciar la búsqueda de coincidencias al final de una cadena. Para asegurarse de que el símbolo de divisa de la referencia cultural actual no se interprete erróneamente como un símbolo de expresión regular, en el ejemplo se llama al método Regex.Escape como escape de caracteres. |
\s* |
Buscar cero o más apariciones de un carácter de espacio en blanco. |
[-+]? |
Busca cero o una aparición de un signo positivo o un signo negativo. |
([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?) |
Los paréntesis externos definen esta expresión como un grupo de captura o una subexpresión. Si se encuentra una coincidencia, se puede recuperar la información de esta parte de la cadena coincidente desde el segundo objeto Group dentro del objeto GroupCollection, que es devuelto por la propiedad Match.Groups. El primer elemento de la colección representa la coincidencia completa. |
[0-9]{0,3} |
Buscar de cero a tres apariciones de los dígitos decimales comprendidos entre 0 y 9. |
(,[0-9]{3})* |
Busque cero o más apariciones de un separador de grupo seguido de tres dígitos decimales. |
\. |
Busque una sola aparición del separador decimal. |
[0-9]+ |
Busque uno o varios dígitos decimales. |
(\.[0-9]+)? |
Busque cero o una sola aparición del separador decimal seguido de al menos un número decimal. |
Si cada subpatrón se encuentra en la cadena de entrada, la coincidencia se realiza correctamente y se agrega un Match objeto que contiene información sobre la coincidencia al MatchCollection objeto .
Artículos relacionados
Título | Descripción |
---|---|
Lenguaje de expresiones regulares: referencia rápida | Proporciona información sobre el conjunto de caracteres, operadores y construcciones que puede usar para definir expresiones regulares. |
Modelo de objetos de expresión regular | Proporciona información y ejemplos de código que ilustran cómo usar las clases de expresiones regulares. |
Detalles del comportamiento de expresiones regulares | Proporciona información sobre las funcionalidades y el comportamiento de las expresiones regulares de .NET. |
Usar expresiones regulares en Visual Studio |