.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. 正規表現を使ったテキスト処理では、正規表現エンジンに対し、最低でも次の 2 つの情報を与える必要があります。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+?) 1 つ以上 (ただし、できるだけ少ない文字数) の単語文字と一致します。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.

現在 "英語 - 米国" (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. ドル記号 ($) を単独で指定した場合、正規表現エンジンは、比較の開始位置を文字列の終端に設定します。現在のカルチャの通貨記号が正規表現記号として解釈されるのを防ぐため、この例では、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* 空白文字の 0 回以上の繰り返しを検索します。Look for zero or more occurrences of a white-space character.
[-+]? 正の符号または負の符号の 0 回または 1 回の繰り返しを検索します。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 オブジェクトの 2 つ目の 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. (コレクションの 1 つ目の要素は、一致した文字列全体を表します)。(The first element in the collection represents the entire match.)
[0-9]{0,3} 10 進数字 (0 ~ 9) の 0 回以上、3 回以下の繰り返しを検索します。Look for zero to three occurrences of the decimal digits 0 through 9.
(,[0-9]{3})* 桁区切り記号と 3 桁の 10 進数字の 0 回以上の繰り返しを検索します。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]+ 10 進数字の 1 回以上の繰り返しを検索します。Look for one or more decimal digits.
(\.[0-9]+)? 小数点と 1 桁以上の数字の 0 回または 1 回の繰り返しを検索します。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.

TitleTitle 説明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)