量指定子

更新 : 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 つの数字、単語境界の順に続く文字列に一致を試みます。以下の例はこの正規表現を示しています。

{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 月

全体的に変更

コンテンツ バグ修正