更新 : 2008 年 7 月
量指定子は、一致と見なすために、入力中に直前の要素 (文字、グループ、または文字クラス) がいくつ存在しなければならないかを指定します。
.NET Framework の正規表現での量指定子
以下の表に、.NET Framework の正規表現でサポートされている量指定子の一覧を示します。量 n および m は、整数定数です。最長一致の量指定子と最短一致の量指定子の違いについては、表の後にある「最長一致の量指定子と最短一致の量指定子」を参照してください。
* |
直前の要素の 0 回以上の繰り返しに一致します。これは {0,} と同等です。* は最長一致の量指定子であり、最短一致でこれに対応するのは *? です。
たとえば、正規表現 \b91*9*\b は、単語境界の後に続く数字 9 に一致を試みます。9 の後には、数字 1 が 0 回以上続き、その後に数字 9 が 0 回以上続いてかまいません。以下の例はこの正規表現を示しています。入力文字列の 9 つの数字のうち、5 つがパターンに一致し、4 つ (95、929、9129、および 9919) が一致しません。
|
+ |
直前の要素の 1 回以上の繰り返しに一致します。これは {1,} と同じです。+ は最長一致の量指定子であり、最短一致でこれに対応するのは +? です。
たとえば、正規表現 \ba(n)+\w*?\b は、文字 a で始まり、文字 n が 1 回以上繰り返されるすべての単語に一致を試みます。以下の例はこの正規表現を示しています。この正規表現は、単語 an、annual、announcement、および antique に一致し、autumn と all では正しく不一致となります。
|
? |
直前の要素の 0 回または 1 回の繰り返しに一致します。これは {0,1} と同じです。? は最長一致の量指定子であり、最短一致でこれに対応するのは ?? です。
たとえば、正規表現 \ban?\b は、文字 a で始まり、文字 n が 0 回または 1 回繰り返されるすべての単語に一致を試みます。つまり、単語 a と an に一致を試みます。以下の例はこの正規表現を示しています。
|
{n} |
直前の要素のちょうど n 回の繰り返しに一致します。{n} は最長一致の量指定子であり、最短一致でこれに対応するのは {n}? です。
たとえば、正規表現 \b\d+\,\d{3}\b は、単語境界、1 つ以上の数字、3 つの数字、単語境界の順に続く文字列に一致を試みます。以下の例はこの正規表現を示しています。
Dim pattern As String = "\b\d+\,\d{3}\b"
Dim input As String = "Sales totaled 103,524 million in January, " + _
"106,971 million in February, but only " + _
"943 million in March."
For Each match As Match In Regex.Matches(input, pattern)
Console.WriteLine("'{0}' found at position {1}.", match.Value, match.Index)
Next
' The example displays the following output:
' '103,524' found at position 14.
' '106,971' found at position 45.
string pattern = @"\b\d+\,\d{3}\b";
string input = "Sales totaled 103,524 million in January, " +
"106,971 million in February, but only " +
"943 million in March.";
foreach (Match match in Regex.Matches(input, pattern))
Console.WriteLine("'{0}' found at position {1}.", match.Value, match.Index);
// The example displays the following output:
// '103,524' found at position 14.
// '106,971' found at position 45.
|
{n,} |
直前の要素の n 回以上の繰り返しに一致します。{n,} は最長一致の量指定子であり、最短一致でこれに対応するのは {n}? です。
たとえば、正規表現 \b\d{2,}\b\D+ は、単語境界、2 つ以上の数字、単語境界、数字以外の文字の順に続く文字列に一致を試みます。以下の例はこの正規表現を示しています。この正規表現は、7 days という語句に一致しません。これは、数字が 1 つしか含まれていないためです。しかし、10 weeks および 300 years という語句には正常に一致します。
|
{n,m} |
直前の要素の n 回以上 m 回以下の繰り返しに一致します。{n,m} は最長一致の量指定子であり、最短一致でこれに対応するのは {n,m}? です。
たとえば、正規表現 (00\s){2,4} は、2 つの 0 とスペースが、2 回以上 4 回以下だけ現れる文字列に一致を試みます。以下の例はこの正規表現を示しています。入力文字列の最後の部分には、このパターンが最大の 4 回ではなく 5 回含まれていることに注意してください。しかし、このサブ文字列の最初の部分 (5 つ目の 0 のペアの前のスペースまで) が、正規表現パターンに一致します。
|
*? |
直前の要素の 0 回以上の繰り返しに一致しますが、できるだけ少ない繰り返しを探します。これは、最長一致の量指定子 * に対応する、最短一致の量指定子です。
たとえば、正規表現 \b\w*?oo\w*?\b は、文字列 oo を含むすべての単語に一致します。以下の例はこの正規表現を示しています。
|
+? |
直前の要素の 1 回以上の繰り返しに一致しますが、できるだけ少ない繰り返しを探します。これは、最長一致の量指定子 + に対応する、最短一致の量指定子です。
たとえば、正規表現 \b\w+?\b は、単語境界で区切られた 1 つ以上の文字に一致します。以下の例はこの正規表現を示しています。
|
?? |
直前の要素の 0 回または 1 回の繰り返しに一致しますが、できるだけ少ない繰り返しを探します。これは、最長一致の量指定子 ? に対応する、最短一致の量指定子です。
たとえば、正規表現 ^(\s)*(System.)??Console.Write(Line)??\(?? は、文字列 Console.Write または Console.WriteLine に一致します。この文字列には、Console の前に System. が含まれていてもよく、最後に左かっこがあってもかまいません。文字列は行の先頭にある必要がありますが、その前に空白があってもかまいません。以下の例はこの正規表現を示しています。
|
{n}? |
直前の要素のちょうど n 回の繰り返しに一致します。これは、最長一致の量指定子 {n}+ に対応する、最短一致の量指定子です。
たとえば、正規表現 \b(\w{3,}?\.){2}?\w{3,}?\b は、文字の後の単語境界にピリオドが続く組み合わせがちょうど 2 回繰り返された場合に一致します。その後、別の文字のセットと単語境界が続きます。この正規表現は、Web サイトのアドレスを識別します。以下の例はこの正規表現を示しています。www.microsoft.com と mdsn.microsoft.com には一致しますが、mywebsite や mycompany.com には一致しない点に注意してください。
|
{n,}? |
直前の要素の n 回以上の繰り返しに一致しますが、できるだけ少ない繰り返しを探します。これは、最長一致の量指定子 {n,} に対応する、最短一致の量指定子です。
説明のため、{n}? 量指定子の例を確認してください。この例の正規表現は、量指定子 {n,} を使用して、3 つ以上の文字の後にピリオドが続く文字列に一致します。 |
{n,m}? |
直前の要素の n 回以上 m 回以下の繰り返しに一致しますが、できるだけ少ない繰り返しを探します。これは、最長一致の量指定子 {n,m} に対応する、最短一致の量指定子です。
たとえば、正規表現 \b[A-Z](\w*?\s*?){1,10}[.!?] は、1 個から 10 個の単語を含んだ文に一致します。この正規表現は、単語境界、1 個の大文字、0 個以上の単語文字の 1 から 10 回の繰り返し、オプションで空白文字の順に続く文字列に一致します。一致はピリオド、感嘆符、または疑問符で終了します。以下の例はこの正規表現を示しています。これは、18 個の単語が含まれている 1 つの文を除き、入力文字列中のすべての文に一致します。
|
最長一致の量指定子と最短一致の量指定子
いくつかの量指定子には以下の 2 つのバージョンがあります。
クレジット カード番号などの数値の列から最後の 4 つの数字を取り出す、非常に単純化した正規表現を考えると、違いがわかります。最長一致の量指定子 * を使用するバージョンの正規表現は、\b.*([0-9]{4})\b です。しかし、2 つの数値が含まれている文字列の場合、以下の例に示すように、2 番目の数値の最後の 4 つの数字だけが表示されます。
Dim greedyPattern As String = "\b.*([0-9]{4})\b"
Dim input1 As String = "1112223333 3992991999"
For Each match As Match In Regex.Matches(input1, greedypattern)
Console.WriteLine("Account ending in ******{0}.", match.Groups(1).Value)
Next
' The example displays the following output:
' Account ending in ******1999.
string greedyPattern = @"\b.*([0-9]{4})\b";
string input1 = "1112223333 3992991999";
foreach (Match match in Regex.Matches(input1, greedyPattern))
Console.WriteLine("Account ending in ******{0}.", match.Groups[1].Value);
// The example displays the following output:
// Account ending in ******1999.
これは期待した動作ではありません。この正規表現は最初の数値の一致に失敗します。量指定子 * では、直前の要素をできるだけ頻繁に文字列全体に一致させようとし、文字列の最後まで一致と見なされるためです。
これに対し、最短一致の量指定子 *? を使用した対応する正規表現は、以下の例に示すように期待どおりに動作します。
Dim lazyPattern As String = "\b.*?([0-9]{4})\b"
Dim input2 As String = "1112223333 3992991999"
For Each match As Match In Regex.Matches(input2, lazypattern)
Console.WriteLine("Account ending in ******{0}.", match.Groups(1).Value)
Next
' The example displays the following output:
' Account ending in ******3333.
' Account ending in ******1999.
string lazyPattern = @"\b.*?([0-9]{4})\b";
string input2 = "1112223333 3992991999";
foreach (Match match in Regex.Matches(input2, lazyPattern))
Console.WriteLine("Account ending in ******{0}.", match.Groups[1].Value);
// The example displays the following output:
// Account ending in ******3333.
// Account ending in ******1999.
多くの場合、最長一致と最短一致の量指定子を使用した正規表現は、同じ一致結果を返します。異なる結果を返すことが最も多いのは、どの文字にも一致するメタ文字のピリオド ( . ) を使用した場合です。
参照
その他の技術情報
正規表現言語要素
履歴の変更
2008 年 7 月 |
全体的に変更 |
コンテンツ バグ修正 |