Expresiones regulares de .NET.NET Regular Expressions

Las expresiones regulares proporcionan un método eficaz y flexible para procesar texto.Regular expressions provide a powerful, flexible, and efficient method for processing text. La notación extensiva de búsqueda de patrones coincidentes de las expresiones regulares permite analizar rápidamente grandes cantidades de texto para buscar patrones de caracteres específicos; para validar un texto con el fin de asegurar que se corresponde con un patrón predefinido (por ejemplo, una dirección de correo electrónico); para extraer, editar, reemplazar o eliminar subcadenas de texto; y para agregar las cadenas extraídas a una colección con el fin de generar un informe.The extensive pattern-matching notation of regular expressions enables you to quickly parse large amounts of text to find specific character patterns; to validate text to ensure that it matches a predefined pattern (such as an email address); to extract, edit, replace, or delete text substrings; and to add the extracted strings to a collection in order to generate a report. Para muchas aplicaciones que usan cadenas o analizan grandes bloques de texto, las expresiones regulares son una herramienta indispensable.For many applications that deal with strings or that parse large blocks of text, regular expressions are an indispensable tool.

Funcionamiento de las expresiones regularesHow Regular Expressions Work

El eje del procesamiento de texto mediante expresiones regulares es el motor de expresiones regulares, que viene representado por el objeto System.Text.RegularExpressions.Regex en .NET.The centerpiece of text processing with regular expressions is the regular expression engine, which is represented by the System.Text.RegularExpressions.Regex object in .NET. Como mínimo, el procesamiento de texto mediante expresiones regulares necesita que el motor de expresiones regulares disponga de los dos elementos de información siguientes:At a minimum, processing text using regular expressions requires that the regular expression engine be provided with the following two items of information:

  • El patrón de expresión regular que se debe identificar en el texto.The regular expression pattern to identify in the text.

    En .NET, los patrones de expresiones regulares se definen mediante una sintaxis o un lenguaje especial, que es compatible con las expresiones regulares de Perl 5 y agrega algunas características adicionales, como búsquedas de coincidencias de derecha a izquierda.In .NET, regular expression patterns are defined by a special syntax or language, which is compatible with Perl 5 regular expressions and adds some additional features such as right-to-left matching. Para obtener más información, consulte Lenguaje de expresiones regulares: Referencia rápida.For more information, see Regular Expression Language - Quick Reference.

  • El texto que se debe analizar para el patrón de expresión regular.The text to parse for the regular expression pattern.

Los métodos de la clase Regex permiten realizar las operaciones siguientes:The methods of the Regex class let you perform the following operations:

Para obtener información general acerca del modelo de objetos de expresiones regulares, consulte El modelo de objetos de expresión regular.For an overview of the regular expression object model, see The Regular Expression Object Model.

Para obtener más información acerca del lenguaje de expresiones regulares, consulte Lenguaje de expresiones regulares - Referencia rápida o descargue e imprima uno de estos folletos:For more information about the regular expression language, see Regular Expression Language - Quick Reference or download and print one of these brochures:

Referencia rápida en formato Word (.docx)Quick Reference in Word (.docx) format
Referencia rápida en formato PDF (.pdf)Quick Reference in PDF (.pdf) format

Ejemplos de expresiones regularesRegular Expression Examples

La clase String incluye varios métodos de búsqueda y reemplazo de cadenas que puede usar cuando desee buscar cadenas literales en una cadena mayor.The String class includes a number of string search and replacement methods that you can use when you want to locate literal strings in a larger string. Las expresiones regulares son muy útiles cuando se desea buscar una de varias subcadenas en una cadena mayor o cuando se desea identificar patrones en una cadena, como se muestra en los ejemplos siguientes.Regular expressions are most useful either when you want to locate one of several substrings in a larger string, or when you want to identify patterns in a string, as the following examples illustrate.

Ejemplo 1: reemplazar subcadenasExample 1: Replacing Substrings

Suponga que una lista de distribución de correo contiene nombres que a veces incluyen un tratamiento (Sr., Sra. o Srta.) junto con un nombre y un apellido.Assume that a mailing list contains names that sometimes include a title (Mr., Mrs., Miss, or Ms.) along with a first and last name. Si no desea incluir los tratamientos al generar las etiquetas de los sobres a partir de la lista, puede usar una expresión regular para quitarlos, como se muestra en el ejemplo siguiente.If you do not want to include the titles when you generate envelope labels from the list, you can use a regular expression to remove the titles, as the following example illustrates.

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.".The regular expression pattern(Mr\.? |Mrs\.? |Miss |Ms\.? ) matches any occurrence of "Mr ", "Mr. ", "Mrs ", "Mrs. ", "Miss ", "Ms or "Ms. ". La llamada al método Regex.Replace reemplaza la cadena coincidente con String.Empty; es decir, la quita de la cadena original.The call to the Regex.Replace method replaces the matched string with String.Empty; in other words, it removes it from the original string.

Ejemplo 2: identificar palabras duplicadasExample 2: Identifying Duplicated Words

Duplicar palabras accidentalmente es un error frecuente que cometen los escritores.Accidentally duplicating words is a common error that writers make. Se puede usar una expresión regular para identificar palabras duplicadas, como se muestra en el ejemplo siguiente.A regular expression can be used to identify duplicated words, as the following example shows.

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("{0} (duplicates '{1}') at position {2}", 
                           match.Value, match.Groups[1].Value, 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 de expresión regular \b(\w+?)\s\1\b se puede interpretar de la manera siguiente:The regular expression pattern \b(\w+?)\s\1\b can be interpreted as follows:

\b Empieza en un límite de palabras.Start at a word boundary.
(\w+?)(\w+?) Coincide con uno o más caracteres de palabra, pero con el menor número de caracteres posible.Match one or more word characters, but as few characters as possible. Juntos, forman un grupo al que se puede hacer referencia como \1.Together, they form a group that can be referred to as \1.
\s Coincide con un carácter de espacio en blanco.Match a white-space character.
\1 Coincide con la subcadena que es igual al grupo denominado \1.Match the substring that is equal to the group named \1.
\b Coincide con un límite de palabras.Match a word boundary.

Se llama al método Regex.Matches con las opciones de expresiones regulares establecidas en RegexOptions.IgnoreCase.The Regex.Matches method is called with regular expression options set to 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.Therefore, the match operation is case-insensitive, and the example identifies the substring "This this" as a duplication.

Observe que la cadena de entrada incluye la subcadena "this?Note that the input string includes the substring "this? This".This". Sin embargo, debido al signo de puntuación intermedio, no se identifica como una duplicación.However, because of the intervening punctuation mark, it is not identified as a duplication.

Ejemplo 3: crear dinámicamente una expresión regular dependiente de la referencia culturalExample 3: Dynamically Building a Culture-Sensitive Regular Expression

En el ejemplo siguiente se muestra la eficacia de las expresiones regulares, además de la flexibilidad que ofrecen las características de globalización de .NET.The following example illustrates the power of regular expressions combined with the flexibility offered by .NET's globalization features. Se usa el objeto NumberFormatInfo para determinar el formato de los valores de divisa en la referencia cultural actual del sistema.It uses the NumberFormatInfo object to determine the format of currency values in the system's current culture. A continuación, se usa dicha información para construir dinámicamente una expresión regular que extrae los valores de divisa del texto.It then uses that information to dynamically construct a regular expression that extracts currency values from the text. Para cada coincidencia, se extrae el subgrupo que solo contiene la cadena numérica, se convierte el subgrupo en un valor Decimal y se calcula un total acumulativo.For each match, it extracts the subgroup that contains the numeric string only, converts it to a Decimal value, and calculates a running total.

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 {0} matches.", matches.Count); 

      // 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 {0:C2}.", expenses[expenses.Count - 1]);
      else
         Console.WriteLine("The expenses total {0:C2}.", total);
   }  
}
// 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]+)?).On a computer whose current culture is English - United States (en-US), the example dynamically builds the regular expression \$\s*[-+]?([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?). Este patrón de expresión regular se puede interpretar de la manera siguiente:This regular expression pattern can be interpreted as follows:

\$ Buscar una sola aparición del símbolo de dólar ($) en la cadena de entrada.Look for a single occurrence of the dollar symbol ($) in the input string. 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.The regular expression pattern string includes a backslash to indicate that the dollar symbol is to be interpreted literally rather than as a regular expression anchor. (Si solo apareciese el símbolo $, esto indicaría que el motor de expresiones regulares debe intentar comenzar su 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 interpreta erróneamente como un símbolo de la expresión regular, en el ejemplo se llama al método Escape para marcar el carácter como carácter de escape.(The $ symbol alone would indicate that the regular expression engine should try to begin its match at the end of a string.) To ensure that the current culture's currency symbol is not misinterpreted as a regular expression symbol, the example calls the Escape method to escape the character.
\s* Buscar cero o más apariciones de un carácter de espacio en blanco.Look for zero or more occurrences of a white-space character.
[-+]? Buscar cero o una aparición de un signo positivo o un signo negativo.Look for zero or one occurrence of either a positive sign or a negative sign.
([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?) Los paréntesis externos alrededor de esta expresión la definen como un grupo de captura o una subexpresión.The outer parentheses around this expression define it as a capturing group or a subexpression. Si se encuentra una coincidencia, la información sobre esta parte de la cadena coincidente se puede recuperar del segundo objeto Group en el objeto GroupCollection devuelto por la propiedad Match.Groups.If a match is found, information about this part of the matching string can be retrieved from the second Group object in the GroupCollection object returned by the Match.Groups property. (El primer elemento de la colección representa la coincidencia completa.)(The first element in the collection represents the entire match.)
[0-9]{0,3} Buscar de cero a tres apariciones de los dígitos decimales comprendidos entre 0 y 9.Look for zero to three occurrences of the decimal digits 0 through 9.
(,[0-9]{3})* Buscar cero o más apariciones de un separador de grupos seguido de tres dígitos decimales.Look for zero or more occurrences of a group separator followed by three decimal digits.
\. Buscar una única aparición del separador decimal.Look for a single occurrence of the decimal separator.
[0-9]+ Buscar uno o más dígitos decimales.Look for one or more decimal digits.
(\.[0-9]+)? Buscar cero o una aparición del separador decimal seguido de al menos un dígito decimal.Look for zero or one occurrence of the decimal separator followed by at least one decimal digit.

Si se encuentra cada uno de estos subpatrones en la cadena de entrada, la búsqueda de coincidencias se realiza correctamente y se agrega al objeto Match un objeto MatchCollection que contiene información sobre la coincidencia.If each of these subpatterns is found in the input string, the match succeeds, and a Match object that contains information about the match is added to the MatchCollection object.

TitleTitle DescriptionDescription
Lenguaje de expresiones regulares: referencia rápidaRegular Expression Language - Quick Reference Ofrece información sobre el conjunto de caracteres, operadores y construcciones que se pueden utilizar para definir expresiones regulares.Provides information on the set of characters, operators, and constructs that you can use to define regular expressions.
Modelo de objetos de expresión regularThe Regular Expression Object Model Proporciona información y ejemplos de código que muestran cómo usar las clases de expresiones regulares.Provides information and code examples that illustrate how to use the regular expression classes.
Detalles del comportamiento de expresiones regularesDetails of Regular Expression Behavior Proporciona información sobre las funcionalidades y el comportamiento de las expresiones regulares de .NET.Provides information about the capabilities and behavior of .NET regular expressions.
Ejemplos de expresiones regularesRegular Expression Examples Proporciona ejemplos de código que muestran los usos habituales de las expresiones regulares.Provides code examples that illustrate typical uses of regular expressions.

ReferenciaReference

System.Text.RegularExpressions
System.Text.RegularExpressions.Regex
Expresiones regulares: referencia rápida (descarga en formato Word)Regular Expressions - Quick Reference (download in Word format)
Expresiones regulares: referencia rápida (descarga en formato PDF)Regular Expressions - Quick Reference (download in PDF format)