エクスポート (0) 印刷
すべて展開
この記事は翻訳者によって翻訳されたものです。 記事の文章にポインターを重ねると、原文のテキストが表示されます。
訳文
原文

正規表現言語 - クイック リファレンス

正規表現を使用すると、強力、柔軟、そして効率的な方法でテキストを処理できます。 正規表現の広範なパターン一致表記法を使用することで、大量のテキストをすばやく解析して特定の文字パターンを検索したり、決められたパターン (電子メール アドレスなど) と照らしてテキストを検証したりできるほか、テキストの部分文字列を抽出、編集、置換、または削除したり、抽出した文字列をコレクションに追加してレポートを生成したりすることもできます。 文字列処理や大量のテキストを解析する多くのアプリケーションにとって、正規表現は欠くことのできないツールです。

正規表現を使ったテキスト処理の最も重要な部分は、.NET Framework for Silverlight の System.Text.RegularExpressions.Regex オブジェクトによって表される正規表現エンジンです。 正規表現を使ったテキスト処理では、正規表現エンジンに対し、最低でも次の 2 つの情報を与える必要があります。

  • テキストを識別する正規表現パターン。

    .NET Framework for Silverlight では、正規表現のパターンが特殊な構文または言語で定義されます。この構文または言語には、Perl 5 の正規表現と互換性があるほか、右から左への一致処理など、いくつかの機能が追加されています。 詳細については、.NET Framework ドキュメントの「言語としての正規表現」および「正規表現言語要素」を参照してください。

  • 正規表現パターンの解析対象となるテキスト。

    メモ メモ :

    .NET Framework for Silverlight の正規表現エンジンと .NET Framework の正規表現エンジンとの間に実装上の違いはありません。 ただし、1 つだけ例外があります。.NET Framework for Silverlight はコンパイル済みの正規表現をサポートしていません。コンパイル済みの正規表現は、独立したアセンブリに専用の正規表現エンジンと共に格納される定義済みの正規表現パターンです。この正規表現パターンは、一緒に格納されている正規表現エンジンによって処理されます。

Regex クラスのメソッドを使用すると、次のような処理を実行できます。

正規表現のオブジェクト モデルの概要については、.NET Framework のドキュメントの「正規表現クラス」を参照してください。

ここでは、正規表現による強力なテキスト処理と、.NET Framework の柔軟なグローバリゼーション機能とを組み合わせて使用する例を紹介します。 この例では、システムの現在のカルチャで用いられている通貨値の形式を調べるために、DateTimeFormatInfo オブジェクトが使用されています。 さらに、その情報をもとに、テキストから通貨値を抽出する正規表現を動的に構築します。 検出された一致ごとに、数字のみを含んだサブグループを抽出し、Decimal 値に変換して、通算の合計を計算します。


using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text.RegularExpressions;

public class Example
{
   public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      // 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 DateTimeFormatInfo 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 : ""); 
      outputBlock.Text += "The regular expression pattern is:\n";
      outputBlock.Text += "   " + pattern + "\n";      

      // Get text that matches regular expression pattern.
      MatchCollection matches = Regex.Matches(input, pattern, RegexOptions.IgnorePatternWhitespace);               
      outputBlock.Text += String.Format("Found {0} matches.\n", 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]) 
         outputBlock.Text += String.Format("The expenses total {0:C2}.", expenses[expenses.Count - 1]);
      else
         outputBlock.Text += String.Format("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.


現在 en-US カルチャが使用されているコンピューターでは、\$\s*[-+]?([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?) という正規表現が動的に構築されます。 この正規表現パターンは、次のように解釈できます。

\$

入力文字列に含まれる単一のドル記号 ($) を検索します。 この正規表現パターン文字列に使用されている円記号は、ドル記号を正規表現のアンカーではなく、文字として扱うことを意味します。 ドル記号 ($) を単独で指定した場合、正規表現エンジンは、比較の開始位置を文字列の終端に設定します。 現在のカルチャの通貨記号が正規表現記号として解釈されるのを防ぐため、この例では、Escape メソッドを呼び出して文字をエスケープしています。

\s*

空白文字の 0 回以上の繰り返しを検索します。

[-+]?

正の符号または負の符号の 0 回または 1 回の繰り返しを検索します。

([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?)

この式の外側の丸かっこで囲まれている表現は、キャプチャ グループまたは部分式として定義されます。 一致が見つかった場合、その一致した文字列の、この部分に関する情報が、Match.Groups プロパティから返された GroupCollection オブジェクトの 2 つ目の Group オブジェクトから取得できます (コレクションの 1 つ目の要素は、一致した文字列全体を表します)。

[0-9]{0,3}

10 進数字 (0 ~ 9) の 0 回以上、3 回以下の繰り返しを検索します。

(,[0-9]{3})*

桁区切り記号と 3 桁の数字の 0 回以上の繰り返しを検索します。

\.

単一の小数点を検索します。

[0-9]+

10 進数字の 1 回以上の繰り返しを検索します。

(\.[0-9]+)?

桁区切り記号の後に少なくとも 1 つの 10 進数字が続くパターンを検索します。

以上の各サブパターンが入力文字列内に見つかると一致と判断され、その一致に関する情報を含んだ Match オブジェクトが MatchCollection オブジェクトに追加されます。

コミュニティの追加

追加
表示:
© 2014 Microsoft