Regex.Escape(String) Метод

Определение

Экранирует минимальный набор символов (\, *, +, ?, |, {, [, (,), ^, $, ., #и пробелы, заменяя их escape-кодами. При этом обработчику регулярных выражений дается команда интерпретировать эти символы буквально, а не как метасимволы.

public:
 static System::String ^ Escape(System::String ^ str);
public static string Escape (string str);
static member Escape : string -> string
Public Shared Function Escape (str As String) As String

Параметры

str
String

Входная строка, содержащая преобразуемый текст.

Возвращаемое значение

Строка символов с метасимволами, приведенными в преобразованную форму.

Исключения

str имеет значение null.

Примеры

В следующем примере комментарии извлекаются из текста. Предполагается, что примечания разделены символом начала комментария и символом конца комментария, выбранным пользователем. Поскольку символы комментариев должны интерпретироваться буквально, они передаются Escape в метод , чтобы гарантировать, что они не могут быть неправильно интерпретированы как метасимволы. Кроме того, в примере явным образом проверяется, является ли символ конечного комментария, введенный пользователем, закрывающей скобкой (]) или фигурной скобкой (}). Если это так, символ обратной косой черты (\) добавляется к скобкам или фигурным скобкам, чтобы он интерпретировался буквально. Обратите внимание, что в примере также используется Match.Groups коллекция для отображения только примечания, а не примечания вместе с символами открывающего и закрывающего примечаний.

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      ConsoleKeyInfo keyEntered;
      char beginComment, endComment;
      Console.Write("Enter begin comment symbol: ");
      keyEntered = Console.ReadKey();
      beginComment = keyEntered.KeyChar;
      Console.WriteLine();
      
      Console.Write("Enter end comment symbol: ");
      keyEntered = Console.ReadKey();
      endComment = keyEntered.KeyChar;
      Console.WriteLine();
      
      string input = "Text [comment comment comment] more text [comment]";
      string pattern;
      pattern = Regex.Escape(beginComment.ToString()) + @"(.*?)";
      string endPattern = Regex.Escape(endComment.ToString());
      if (endComment == ']' || endComment == '}') endPattern = @"\" + endPattern;
      pattern += endPattern;
      MatchCollection matches = Regex.Matches(input, pattern);
      Console.WriteLine(pattern);
      int commentNumber = 0;
      foreach (Match match in matches)
         Console.WriteLine("{0}: {1}", ++commentNumber, match.Groups[1].Value);
   }
}
// The example shows possible output from the example:
//       Enter begin comment symbol: [
//       Enter end comment symbol: ]
//       \[(.*?)\]
//       1: comment comment comment
//       2: comment
Imports System.Text.RegularExpressions

Module Example
   Public Sub Main()
      Dim keyEntered As ConsoleKeyInfo
      Dim beginComment, endComment As Char
      Console.Write("Enter begin comment symbol: ")
      keyEntered = Console.ReadKey()
      beginComment = keyEntered.KeyChar
      Console.WriteLine()
      
      Console.Write("Enter end comment symbol: ")
      keyEntered = Console.ReadKey()
      endComment = keyEntered.KeyChar
      Console.WriteLine()
      
      Dim input As String = "Text [comment comment comment] more text [comment]"
      Dim pattern As String = Regex.Escape(beginComment.ToString()) + "(.*?)"
      Dim endPattern As String = Regex.Escape(endComment.ToString())
      If endComment = "]"c OrElse endComment = "}"c Then endPattern = "\" + endPattern
      pattern += endPattern
      
      Dim matches As MatchCollection = Regex.Matches(input, pattern)
      Console.WriteLine(pattern)
      Dim commentNumber As Integer = 0
      For Each match As Match In matches
         commentNumber += 1
         Console.WriteLine("{0}: {1}", commentNumber, match.Groups(1).Value)
      Next         
   End Sub
End Module
' The example shows possible output from the example:
'       Enter begin comment symbol: [
'       Enter end comment symbol: ]
'       \[(.*?)\]
'       1: comment comment comment
'       2: comment

Комментарии

Escape преобразует строку таким образом, чтобы обработчик регулярных выражений интерпретировал любые метасимвы, которые она может содержать, как символьные литералы. Например, рассмотрим регулярное выражение, предназначенное для извлечения комментариев, разделенных прямыми открывающими и закрывающими скобками ([ и ]) из текста. В следующем примере регулярное выражение "[(.*?)]" интерпретируется как класс символов. Вместо сопоставления примечаний, внедренных во входной текст, регулярное выражение сопоставляет каждую открывающую или закрывающую круглые скобки, точку, звездочку или вопросительный знак.

string pattern = "[(.*?)]"; 
string input = "The animal [what kind?] was visible [by whom?] from the window.";

MatchCollection matches = Regex.Matches(input, pattern);
int commentNumber = 0;
Console.WriteLine("{0} produces the following matches:", pattern);
foreach (Match match in matches)
   Console.WriteLine("   {0}: {1}", ++commentNumber, match.Value);  

// This example displays the following output:
//       [(.*?)] produces the following matches:
//          1: ?
//          2: ?
//          3: .
Dim pattern As String = "[(.*?)]" 
Dim input As String = "The animal [what kind?] was visible [by whom?] from the window."

Dim matches As MatchCollection = Regex.Matches(input, pattern)
Dim commentNumber As Integer = 0
Console.WriteLine("{0} produces the following matches:", pattern)
For Each match As Match In matches
   commentNumber += 1
   Console.WriteLine("{0}: {1}", commentNumber, match.Value)       
Next      
' This example displays the following output:
'       1: ?
'       2: ?
'       3: .

Однако если открывающая скобка экранируется путем ее передачи Escape в метод , регулярное выражение успешно сопоставляет комментарии, внедренные во входную строку. Это показано в следующем примере.

string pattern = Regex.Escape("[") + "(.*?)]"; 
string input = "The animal [what kind?] was visible [by whom?] from the window.";

MatchCollection matches = Regex.Matches(input, pattern);
int commentNumber = 0;
Console.WriteLine("{0} produces the following matches:", pattern);
foreach (Match match in matches)
   Console.WriteLine("   {0}: {1}", ++commentNumber, match.Value);  

// This example displays the following output:
//       \[(.*?)] produces the following matches:
//          1: [what kind?]
//          2: [by whom?]
Dim pattern As String = Regex.Escape("[") + "(.*?)]" 
Dim input As String = "The animal [what kind?] was visible [by whom?] from the window."

Dim matches As MatchCollection = Regex.Matches(input, pattern)
Dim commentNumber As Integer = 0
Console.WriteLine("{0} produces the following matches:", pattern)
For Each match As Match In matches
   commentNumber += 1
   Console.WriteLine("   {0}: {1}", commentNumber, match.Value)  
Next
' This example displays the following output:
'       \[(.*?)] produces the following matches:
'          1: [what kind?]
'          2: [by whom?]

В регулярном выражении, определяемом с помощью статического текста, символы, которые должны интерпретироваться буквально, а не как метасимволы, можно экранировать с помощью символа обратной косой черты (\), а также путем вызова Escape метода . В регулярном выражении, которое определяется динамически с помощью символов, которые не известны во время разработки, вызов Escape метода особенно важен для того, чтобы обработчик регулярных выражений интерпретировал отдельные символы как литералы, а не как метасимвы.

Примечание

Если шаблон регулярного выражения содержит знак чисел (#) или литеральные пробелы, они должны быть экранированы, если входной текст анализируется с включенным параметром RegexOptions.IgnorePatternWhitespace .

Хотя Escape метод экранирует прямой Открытие квадратная скобка ([) и открыв скобки ({}), он не экранирует их соответствующий закрывающий символов (] и}). В большинстве случаев не требуется их экранирование. Если закрывающей скобке или фигурной скобке не предшествует соответствующий символ открытия, обработчик регулярных выражений интерпретирует их буквально. Если открывающая скобка или фигурная скобка интерпретируются как метасимватор, обработчик регулярных выражений интерпретирует первый соответствующий закрывающий символ как метасимвуал. Если это не нужное поведение, закрывающая скобка или фигурная скобка должны быть экранированы путем явного добавления символа обратной косой черты (\). Иллюстрацию см. в разделе Пример.

Применяется к

См. также раздел