English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C# 正規表現

正規表現 これは、入力テキストをマッチングするパターンです。

.Net フレームワークは、このようなマッチングを許可する正規表現エンジンを提供しています。

パターンは、1つまたは複数の文字、演算子、構造で構成されています。

正規表現の定義

以下に、正規表現を定義するための様々なカテゴリの文字、演算子、構造が示されています。

  • 文字エスケープ

  • 文字クラス

  • 位置点

  • グループ構造

  • 限定子

  • 逆参照構文

  • 代替構文

  • 置き換え

  • 雑多な構築

文字エスケープ

正規表現の中の反斜線文字(\)は、その後続する文字が特殊文字であることを示し、またはその文字をそのままに解釈する必要があります。

以下にエスケープシーケンスを示します:

エスケープシーケンス説明パターン一致させます。
\a警報(ベル)シーケンス \u0007 一致します。\a警告!" + 「'\u0007の「'」中的 "\u0007"
\b文字クラス内で、バックスパースキー \u0008 一致します。[\b]{3,}"\b\b\b\b" 中的 "\b\b\b\b"
\t制御文字 \u0009 一致します。(\w+)\t"Name\tAddr\t" 中的 "Name\t" と "Addr\t"
\r回車シーケンス \u000D に一致します。(\r と改行シーケンス \n は等価ではありません。)\r\n(\w+)"\r\nHello\nWorld." 中的 "\r\nHello"
\v垂直タブシーケンス \u000B に一致します。[\v]{2,}"\v\v\v" 中的 "\v\v\v"
\f换页シーケンス \u000C に一致します。[\f]{2,}"\f\f\f" 中的 "\f\f\f"
\n改行シーケンス \u000A に一致します。\r\n(\w+)"\r\nHello\nWorld." 中的 "\r\nHello"
\eエスケープシーケンス \u001B に一致します。\e"\x001B" 中的 "\x001B"
\ nnn2から3桁の数字で構成される文字を8進数形式で指定します。\w\040\w"a bc d" 中的 "a b" と "c d"
\x nn2桁の数字で構成される文字を16進数形式で指定します。\w\x20\w"a bc d" 中的 "a b" と "c d"
\c X \c xXまたはxで指定されたASCII制御文字(Xまたはxは制御文字の文字)に一致します。\cC"\x0003" 中的 "\x0003" (Ctrl-C)
\u nnnn4桁の数字で表される Unicode 字符に一致する16進数形式を使用して一致させます(nnnn)。\w\u0020\w"a bc d" 中的 "a b" と "c d"
\認識できないエスケープシーケンスが続いている場合、その文字に一致します。\d+[\+-x\*]\d+\d+[\+-x\*\d+"(2+2) * 3*9" 内の "2+2" 和 "3*9"

文字クラス

文字クラスは、一組の文字のうちのいずれかの文字に一致します。

以下に文字クラスを示します:

文字クラス説明パターン一致させます。
[character_group]character_group 中的任何单个字符に一致します。デフォルトでは、一致は大文字小文字を区別します。[mn]"mat" 中的 "m"、"moon" 中的 "m" と "n"
[^character_group]非:与不在 character_group 中的任何单个字符匹配。 默认情况下,character_group 中的字符区分大小写。[^aei]"avail" 中的 "v" そして "l"
[ first - last ]文字範囲:firstからlastの範囲の任意の単一文字にマッチします。[b-d][b-d]irdsはBirds、Cirds、Dirdsにマッチします。
.ワイルドカード:\n以外の任意の単一文字にマッチします。
原意の句点文字(.または\u002E),その文字の前にエスケープシーケンス(\.)を付けます。
a.e"have" 中的 "ave"、 "mate" 中的 "ate"
\p{ name }name 指定された Unicode 通用カテゴリまたは名前付きブロックの任意の単一文字にマッチします。\p{Lu}"City Lights" 中的 "C" そして "L"
\P{ name }name 指定された Unicode 通用カテゴリまたは名前付きブロックの任意の単一文字にマッチします。\P{Lu}"City" 中的 "i"、 "t" そして "y"
\w任意の単语文字にマッチします。\w"Room#1" 中的 "R"、 "o"、 "m" そして "1"
\W任意の非単语文字にマッチします。\W"Room#1" 中的 "#"
\s任意の空白文字にマッチします。\w\s"ID A1.3" 中的 "D "
\S任意の非空白文字にマッチします。\s\S"int __ctr" 中的 " _"
\d任意の十進数にマッチします。\d"4 = IV" 中的 "4"
\D十進数でない任意の文字をマッチします。\D"4 = IV" 中的 " "、 "="、 " "、 "I" そして "V"

位置点

位置点または原子零幅アサーションは、文字列内の当前位置に応じてマッチを成功または失敗させるが、エンジンは文字列内を进んだり、文字を使用したりしません。

以下に位置点を示します:

アサーション説明パターン一致させます。
^マッチは、文字列または一行の开头から开始する必要があります。^\d{3}"567-777-" 内の "567"
$マッチは、文字列の末尾に出现する必要がありますまたは行または文字列末尾の \n 前に。-\d{4}$"8-12-2012" 内の "-2012"
\Aマッチは、文字列の开头に出现する必要があります。\A\w{4}"Code-007-" 中的 "Code"
\Zマッチは、文字列の末尾に出现する必要がありますまたは文字列末尾の \n 前に。-\d{3}\Z"Bond-901-007" 内の "-007"
\zマッチは、文字列の末尾に出现する必要があります。-\d{3}\z"-901-333" 内の "-333"
\Gマッチは、前回のマッチ終了地点に出现する必要があります。\G(\d)"(1)3)5)7]9)中的 (1)、 (3)" そして "("5)"
\bワード境界をマッチする、つまり単語とスペース間の位置。er\b「never」にある「er」をマッチするが、「verb」にある「er」はマッチしません。
\B非ワード境界をマッチする。er\B「verb」にある「er」をマッチするが、「never」にある「er」はマッチしません。

グループ構造

グループ構造は、正規表現のサブエクスプレッションを説明し、通常、入力文字列のサブストリングをキャプチャするために使用されます。

以下のテーブルには、グループ構造が示されています:

グループ構造説明パターン一致させます。
( subexpression )マッチしたサブエクスプレッションをキャプチャし、0から始まるインデックスに割り当てる。(\w)1"deep" にある "ee"
(?< name >subexpression)マッチしたサブエクスプレッションを名前付きグループにキャプチャする。(?< double>\w)\k< double>"deep" にある "ee"
(?< name1 -name2 >subexpression)バランスグループ定義。(((?'Open'\()[^\(\)]*)+((?'Close-Open'\))[^\(\)]*)+)*(?(Open)(?!))$"3+2^((1-3)*(3-1))" にある "((1-3)*(3-1))"
(?: subexpression)非キャプチャグループを定義する。Write(?:Line)?"Console.WriteLine()" にある "WriteLine"
(?imnsx-imnsx:subexpression)適用または無効にする subexpression で指定されたオプション。A\d{2}(?i:\w+)\b"A12xl A12XL a12xl" にある "A"12xl" そして "A12XL"
(?= subexpression)零幅広正予測先行断言。\w+(?=\.)"He is. The dog ran. The sun is out." にある "is"、 "ran" そして "out"
(?! subexpression)零幅広負予測先行断言。\b(?!un)\w+\b"unsure sure unity used" にある "sure" と "used"
(?<=subexpression)零幅広正復帰後断言。(?A+B+)"1ABB 3ABBC 5AB 5AC" にある "1ABB"、 "3ABB" そして "5AB"
using System;
using System.Text.RegularExpressions;
public class Example
{
   public static void Main()
   {
      string input = "1851 1999 1950 1905 2003";
      string pattern = @"(?<=19)\d{2}\b";
      foreach (Match match in Regex.Matches(input, pattern))
         Console.WriteLine(match.Value);
   }
}


実行例 »

限定子

限定子は、入力文字列内に前に一致した要素(文字、グループ、文字クラス)がいくつ存在するかを指定します。限定子には以下に示される言語要素が含まれます。

以下に限定子の一覧を示します:

限定子説明パターン一致させます。
*前の要素が零回または複数回一致させるように一致させます。\d*.\d".0"、 "19.9"、 "219.9"
+前の要素が一度または複数回一致させるように一致させます。"be+""been" 内の "bee"、 "bent" 内の "be"
?前の要素が零回または一度一致させるように一致させます。"rai?n""ran"、 "rain"
{ n }前の要素が正確に n 回一致させるように一致させます。",\d{3}"1,043.6" 内の ",043",9,876,543,210" 内の ",876"、 ",543" 和 ",210"
{ n ,}前の要素が少なくとも n 回一致させるように一致させます。"\d{2,}""166"、 "29"、 "1930"
{ n , m }前の要素が少なくとも n 回一致させるが、多くならないように一致させます。"\d{3,5}"166",17668", "193024" 内の "19302"
*?前の要素が零回または複数回一致させるが、回数ができるだけ少ないように一致させます。\d*?\.\d".0"、 "19.9"、 "219.9"
+?前の要素が一度または複数回一致させるが、回数ができるだけ少ないように一致させます。"be+?""been" 内の "be"、 "bent" 内の "be"
??前の要素が零回または一度一致させるが、回数ができるだけ少ないように一致させます。"rai??n""ran"、 "rain"
{ n }?前の要素が正確に n 回一致させるように一致させます。",\d{3}?""1,043.6" 内の ",043",9,876,543,210" 内の ",876"、 ",543" 和 ",210"
{ n ,}?前の要素が少なくとも n 回一致させるが、回数ができるだけ少ないように一致させます。"\d{2,}?""166"、 "29" 和 "1930"
{ n , m }?前の要素の回数が n と m の間で、回数ができるだけ少ないように一致させます。"\d{3,5}?""166",17668", "193024" 内の "193" 和 "024"

逆参照構文

逆参照は、同じ正規表現内で以前に一致した子表現を後に識別するために使用されます。

以下に逆参照構文の一覧を示します:

逆参照構文説明パターン一致させます。
\ number逆参照。番号付き子表現の値を一致させます。(\w)1"seek" 内の "ee"
\k< name >名前付き逆参照。名前付き表現の値を一致させます。(?< char>\w)\k< char>"seek" 内の "ee"

代替構文

代替構文は、正規表現を変更して either を有効にするために使用されます。/or 一致させます。

以下に代替構文の一覧を示します:

代替構文説明パターン一致させます。
|垂直線(|)文字で区切られた要素のいずれかを一致させます。th(e|is|at)"this is the day. " 中的 "the" 和 "this"
(?( expression )yes | no )正規表現パターンが expression で指定されている場合にマッチします yes;それとも選択可能な no 部分。 expression はゼロ幅の断言として解釈されます。(?(A)A\d{2}\b|\b\d{3}\b)"A10 C103 910" 中的 "A10" 和 "910"
(?( name )yes | no )nameまたは名前付きまたは番号付きのキャプチャグループがマッチしている場合にマッチします yes;それとも選択可能な no(?< quoted>")?(?(quoted).+?"|\S+\s)"Dogs.jpg "Yiska playing.jpg"" 中的 Dogs.jpg 和 "Yiska playing.jpg"

置き換え

置き換えは、置き換えパターンで使用される正規表現です。

以下の表に、置き換えに使用される文字が示されています:

文字説明パターン置き換えパターン入力文字列結果文字列
$numberグループに従って置き換えます number マッチした部分文字列。\b(\w+)(\s)(\w+)\b$3$2$1"one two""two one"
${name}名前付きグループに従って置き換えます name マッチした部分文字列。\b(?< word1>\w+)(\s)(?< word2>\w+)\b${word2} ${word1}"one two""two one"
$$文字「$」を置き換えます。\b(\d+)\s?USD$$$1"103 USD""$103"
$&マッチしたすべての項目のコピーを置き換えます。(\$*(\d*(\.+\d+)?){1)**$&"$1.30""**$1.30**"
$`マッチする前に入力文字列のすべてのテキストを置き換えます。B+$`"AABBCC""AAAACC"
$'マッチした文字列のすべてのテキストを置き換えます。B+$'"AABBCC""AACCCC"
$+最後にキャプチャしたグループを置き換えます。B+(C+)$+"AABBCCDD"AACCDD
$_入力文字列全体を置き換えます。B+$_"AABBCC""AAAABBCCCC"

雑多な構築

以下の表に、さまざまな雑多な構築が示されています:

構築説明
(?imnsx-imnsx)パターンの中で、大文字と小文字を区別しないなどのオプションを設定または無効にします。\bA(?i)b\w+\b マッチ "ABA Able Act" 中的 "ABA" 和 "Able"
(?#コメント)インラインコメント。このコメントは最初の右括弧で終了します。\bA(?#マッチして、Aで始まる単語)\w+\b
#}} [行末]このコメントは非エスケープされた#で始まり、行の終わりまで続きます。(?x)\bA\w+\b#Aで始まる単語を一致させる

Regexクラス

Regexクラスは正規表現を表します。

以下のテーブルには、Regexクラスの一般的なメソッドが示されています:

番号メソッド & 説明
1public bool IsMatch( string input )
指定された正規表現が指定された入力文字列中に一致するかどうかを示します。
2public bool IsMatch( string input, int startat )
指定された正規表現が指定された入力文字列中に一致するかどうかを示します。指定された開始位置から始めています。
3public static bool IsMatch( string input, string pattern )
指定された正規表現が指定された入力文字列中に一致するかどうかを示します。
4public MatchCollection Matches( string input )
指定された入力文字列中で、正規表現のすべての一致項を検索します。
5public string Replace( string input, string replacement )
指定された入力文字列中で、正規表現パターンに一致するすべての文字列を指定された置換文字列に置き換えます。
6public string[] Split( string input )
入力文字列をサブ文字列の配列に分割し、Regex構造関数で指定された正規表現パターンに基づいて分割します。

Regexクラスの完全な属性リストについては、マイクロソフトのC#ドキュメントを参照してください。

例 1

以下の例では、'S' で始まる単語が一致しました:

オンラインサンプル

using System;
using System.Text.RegularExpressions;
namespace RegExApplication
{
   class Program
   {
      private static void showMatch(string text, string expr)
      {
         Console.WriteLine("The Expression: ") + expr);
         MatchCollection mc = Regex.Matches(text, expr);
         foreach (Match m in mc)
         {
            Console.WriteLine(m);
         }
      }
      static void Main(string[] args)
      {
         string str = "A Thousand Splendid Suns";
         Console.WriteLine("Matching words that start with 'S': ");
         showMatch(str, @"\bS\S*");
         Console.ReadKey();
      }
   }
}

上記のコードがコンパイルおよび実行された場合、以下の結果が得られます:

Matching words that start with 'S':
The Expression: \bS\S*
Splendid
Suns

例 2

以下の例では、'm' で始まり 'e' で終わる単語をマッチングしました:

using System;
using System.Text.RegularExpressions;
namespace RegExApplication
{
   class Program
   {
      private static void showMatch(string text, string expr)
      {
         Console.WriteLine("The Expression: " + expr);
         MatchCollection mc = Regex.Matches(text, expr);
         foreach (Match m in mc)
         {
            Console.WriteLine(m);
         }
      }
      static void Main(string[] args)
      {
         string str = "make maze and manage to measure it";
         Console.WriteLine("Matching words start with 'm' and ends with 'e':");
         showMatch(str, @"\bm\S*e\b");
         Console.ReadKey();
      }
   }
}

上記のコードがコンパイルおよび実行された場合、以下の結果が得られます:

Matching words start with 'm' and ends with 'e':
The Expression: \bm\S*e\b
make
maze
manage
measure

例 3

以下の例では、余分なスペースを置き換えます:

using System;
using System.Text.RegularExpressions;
namespace RegExApplication
{
   class Program
   {
      static void Main(string[] args)
      {
         string input = "Hello   World   ";
         string pattern = "\\s"+";
         string replacement = " ";
         Regex rgx = new Regex(pattern);
         string result = rgx.Replace(input, replacement);
         Console.WriteLine("元の文字列: {0}", input);
         Console.WriteLine("置換文字列: {0}", result);    
         Console.ReadKey();
      }
   }
}

上記のコードがコンパイルおよび実行された場合、以下の結果が得られます:

元の文字列: Hello   World   
置換文字列: Hello World