Regex.Escape(String) メソッド

定義

文字の最小セット (\、*、+、?、|、{、[、(、)、^、$、.、#、空白) をエスケープ コードに置き換えてエスケープします。 これにより、正規表現エンジンではこのような文字がメタ文字ではなくリテラルとして解釈されます。

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

変換対象のテキストを含んでいる入力文字列。

戻り値

String

メタ文字がエスケープされた形式に変換された文字列。

例外

strnullです。

次の例では、テキストからコメントを抽出します。 コメントは、ユーザーが選択した開始コメント記号と終了コメント記号で区切られているものとします。 コメント シンボルはリテラルで解釈されるため、 メソッドに 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 、右かっこ ([) 文字と中かっこ ({) 文字をエスケープしますが、対応する終了文字 (] と }) はエスケープしません。 ほとんどの場合、エスケープは必要ありません。 右角かっこまたは中かっこの前に対応する開始文字がない場合、正規表現エンジンはそれをリテラルで解釈します。 開始角かっこまたは中かっこがメタ文字として解釈される場合、正規表現エンジンは、対応する最初の終了文字をメタ文字として解釈します。 これが目的の動作でない場合は、円記号 (\) 文字を明示的に前に置いて、右かっこまたは中かっこをエスケープする必要があります。 図については、「例」セクションを参照してください。

適用対象

こちらもご覧ください