Регулярные выражения в .NET.NET Regular Expressions

Регулярные выражения предоставляют мощный, гибкий и эффективный способ обработки текста.Regular expressions provide a powerful, flexible, and efficient method for processing text. Комплексная нотация сопоставления шаблонов регулярных выражений позволяет быстро анализировать большие объемы текста для поиска определенных шаблонов символов, проверять текст на соответствие предопределенному шаблону (например, адресу электронной почты), извлекать, изменять, заменять и удалять текстовые подстроки, а также добавлять извлеченные строки в коллекцию для создания отчета.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. Для многих приложений, которые работают со строками или анализируют большие блоки текста, регулярные выражения — незаменимый инструмент.For many applications that deal with strings or that parse large blocks of text, regular expressions are an indispensable tool.

Принцип работы регулярных выраженийHow Regular Expressions Work

Главный компонент обработки текста с помощью регулярных выражений — это механизм регулярных выражений, представленный в .NET объектом System.Text.RegularExpressions.Regex.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. Как минимум, для обработки текста с использованием в регулярных выражений механизму регулярных выражений необходимо предоставить два следующих элемента:At a minimum, processing text using regular expressions requires that the regular expression engine be provided with the following two items of information:

  • Шаблон регулярного выражения для определения текста.The regular expression pattern to identify in the text.

    В .NET шаблоны регулярных выражений определяются специальным синтаксисом или языком, который совместим с регулярными выражениями Perl 5 и добавляет дополнительные возможности, например сопоставление справа налево.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. Дополнительные сведения см. в разделе Элементы языка регулярных выражений. Краткий справочник.For more information, see Regular Expression Language - Quick Reference.

  • Текст, который будет проанализирован на соответствие шаблону регулярного выражения.The text to parse for the regular expression pattern.

Методы класса Regex позволяют выполнять следующие операции:The methods of the Regex class let you perform the following operations:

Обзор объектной модели регулярных выражений см. в разделе Объектная модель регулярных выражений.For an overview of the regular expression object model, see The Regular Expression Object Model.

Дополнительные сведения о языке регулярных выражений см. в кратком справочнике по элементам языка регулярных выражений или в одной из следующих брошюр, который вы можете скачать и распечатать:For more information about the regular expression language, see Regular Expression Language - Quick Reference or download and print one of these brochures:

Краткий справочник в формате Word (DOCX);Quick Reference in Word (.docx) format
Краткий справочник в формате PDF (PDF).Quick Reference in PDF (.pdf) format

Примеры регулярных выраженийRegular Expression Examples

Класс String содержит ряд методов для поиска и замены строк, которые можно использовать для поиска строковых литералов в длинных строках.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. Регулярные выражения максимально полезны, если требуется найти одну из нескольких подстрок в длинной строке или определить шаблоны в строке, как показано в следующих примерах.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.

Пример 1: Замена подстрокExample 1: Replacing Substrings

Предположим, что список рассылки содержит имена, в которые иногда входит обращение (Mr., Mrs., Miss или Ms.) в дополнение к имени и фамилии.Assume that a mailing list contains names that sometimes include a title (Mr., Mrs., Miss, or Ms.) along with a first and last name. Если вы не хотите включать обращения при создании этикеток для конвертов из списка, с помощью регулярного выражения их можно удалить, как показано в следующем примере.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

Шаблон регулярного выражения (Mr\.? |Mrs\.? |Miss |Ms\.? ) сопоставляет все вхождения строк "Mr", "Mr.", "Mrs", "Mrs.", "Miss", "Ms" или "Ms.".The regular expression pattern (Mr\.? |Mrs\.? |Miss |Ms\.? ) matches any occurrence of "Mr ", "Mr. ", "Mrs ", "Mrs. ", "Miss ", "Ms or "Ms. ". После вызова метода Regex.Replace сопоставленная строка заменяется на String.Empty; другими словами, она удаляется из исходной строки.The call to the Regex.Replace method replaces the matched string with String.Empty; in other words, it removes it from the original string.

Пример 2: Поиск повторяющихся словExample 2: Identifying Duplicated Words

Случайный повтор слов — это распространенная ошибка при написании текстов.Accidentally duplicating words is a common error that writers make. Регулярное выражение можно использовать для определения повторяющихся слов, как показано в следующем примере.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

Шаблон регулярного выражения \b(\w+?)\s\1\b интерпретируется следующим образом:The regular expression pattern \b(\w+?)\s\1\b can be interpreted as follows:

\b Начало на границе слова.Start at a word boundary.
(\w+?)(\w+?) Соответствует одному или нескольким символам слова (как можно меньшему количеству).Match one or more word characters, but as few characters as possible. Вместе они формируют группу, к которой можно обращаться как к \1.Together, they form a group that can be referred to as \1.
\s Соответствует пробелу.Match a white-space character.
\1 Сопоставление подстроки, равной группе с именем \1.Match the substring that is equal to the group named \1.
\b Соответствует границе слова.Match a word boundary.

Метод Regex.Matches вызывается с параметрами регулярного выражения RegexOptions.IgnoreCase.The Regex.Matches method is called with regular expression options set to RegexOptions.IgnoreCase. Поэтому операция сопоставления учитывает регистр, а пример указывает, что подстрока "This this" является повтором.Therefore, the match operation is case-insensitive, and the example identifies the substring "This this" as a duplication.

Обратите внимание, что входная строка содержит подстроку "this?Note that the input string includes the substring "this? This".This". Но из-за знака пунктуации она не считается повторением.However, because of the intervening punctuation mark, it is not identified as a duplication.

Пример 3. Динамическое создание регулярного выражения с учетом языка и региональных параметровExample 3: Dynamically Building a Culture-Sensitive Regular Expression

Следующий пример демонстрирует преимущества использования регулярных выражений с гибкими возможностями глобализации .NET.The following example illustrates the power of regular expressions combined with the flexibility offered by .NET's globalization features. В примере объект NumberFormatInfo применяется для определения формата денежных значений в текущих региональных стандартах системы.It uses the NumberFormatInfo object to determine the format of currency values in the system's current culture. Затем эти данные используются для динамического создания регулярного выражения, которое извлекает денежные значения из текста.It then uses that information to dynamically construct a regular expression that extracts currency values from the text. Для каждого совпадения извлекается подгруппа, содержащая только числовые строки, которая преобразуется в значение Decimal, после чего рассчитывается промежуточный итог.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.

На компьютере с региональными параметрами "English - United States (en-US)" пример динамически создает регулярное выражение \$\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]+)?). Шаблон регулярного выражения интерпретируется следующим образом:This regular expression pattern can be interpreted as follows:

\$ Выполняется поиск одного вхождения символа доллара ($) во входной строке.Look for a single occurrence of the dollar symbol ($) in the input string. Строка шаблона регулярного выражения содержит обратную косую черту, что говорит о том, что символ доллара интерпретируется буквально, а не как привязка регулярного выражения.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. (Отдельный символ $ указывает, что механизм регулярных выражений должен начинать сопоставление с конца строки.) Чтобы правильно обработать текущий символ валюты, в примере вызывается метод Regex.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 Regex.Escape method to escape the character.
\s* Поиск нуля или нескольких вхождений пробела.Look for zero or more occurrences of a white-space character.
[-+]? Поиск нуля или нескольких вхождений знака плюс или минус.Look for zero or one occurrence of either a positive sign or a negative sign.
([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?) Внешние круглые скобки вокруг этого выражения делают его захватываемой группой или частью выражения.The outer parentheses around this expression define it as a capturing group or a subexpression. Если найдено соответствие, сведения об этой части строки можно получить из второго объекта Group в объекте GroupCollection, который возвращается свойством 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. (Первый элемент в коллекции представляет все сопоставление.)(The first element in the collection represents the entire match.)
[0-9]{0,3} Поиск 0-3 вхождений десятичных цифр (0-9).Look for zero to three occurrences of the decimal digits 0 through 9.
(,[0-9]{3})* Поиск нуля или нескольких вхождений разделителя группы, за которыми следуют три десятичные цифры.Look for zero or more occurrences of a group separator followed by three decimal digits.
\. Поиск одного вхождения десятичного разделителя.Look for a single occurrence of the decimal separator.
[0-9]+ Поиск одной или нескольких десятичных цифр.Look for one or more decimal digits.
(\.[0-9]+)? Поиск нуля или одного вхождения десятичного разделителя, за которым следует по крайней мере одна десятичная цифра.Look for zero or one occurrence of the decimal separator followed by at least one decimal digit.

Если каждый из этих подшаблонов найден во входной строке, сопоставление является успешным, а объект Match с информацией о сопоставлении добавляется в объект MatchCollection.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.

ЗаголовокTitle ОПИСАНИЕDescription
Элементы языка регулярных выражений — краткий справочникRegular Expression Language - Quick Reference Сведения о наборе символов, операторов и конструкций, которые можно использовать для определения регулярных выражений.Provides information on the set of characters, operators, and constructs that you can use to define regular expressions.
Объектная модель регулярных выраженийThe Regular Expression Object Model Сведения об использовании классов регулярных выражений и примеры кода.Provides information and code examples that illustrate how to use the regular expression classes.
Подробные сведения о поведении регулярных выраженийDetails of Regular Expression Behavior Сведения о возможностях и поведении регулярных выражений платформы .NET.Provides information about the capabilities and behavior of .NET regular expressions.
Примеры регулярных выраженийRegular Expression Examples Примеры кода, демонстрирующие типичное применение регулярных выражений.Provides code examples that illustrate typical uses of regular expressions.

СправочникReference

System.Text.RegularExpressions
System.Text.RegularExpressions.Regex
Краткий справочник по регулярным выражениям (скачать в формате Word)Regular Expressions - Quick Reference (download in Word format)
Регулярные выражения — краткий справочник (загрузить в формате PDF)Regular Expressions - Quick Reference (download in PDF format)