以下のメタ文字列は繰り返しを表現します。 直前の部分式を何回繰り返すかを指定します。このような繰り返しを 表すメタ文字列を量指定子(quantifier)と呼びます。
- 0回以上
- 1回以上
? 0回もしくは1回
{n} ちょうどn回(nは数字)
{n,} n回以上(nは数字)
{,m} m回以下(mは数字)
{n,m} n回以上m回以下(n,mは数字)
以下の例で、量指定子の基本的な使いかたを示しています。
# 以下の正規表現は 最初に大文字が1文字以上(H)で、小文字が1文字以上(l)、
# lが2文字(ll)の後ろにoが続く文字列にマッチします。
"Hello".match(/[[:upper:]]+[[:lower:]]+l{2}o/) # => #< MatchData "Hello">
これらは「欲張り(greedy)」にマッチします。 マッチが成功する、最長の文字列にマッチしようとします。 そのため、これらの量指定子は特に最大量指定子(greedy quantifier) と呼ばれます。
最小量指定子(reluctant quantifier)
一方、以下のメタ文字列(普通の繰り返しメタ文字列に ? を付加したもの) はマッチが成功する、最短の文字列にマッチします。そのため、これらの 量指定子は特に最小量指定子(reluctant quantifier)と呼ばれます。
*? 0回以上
+? 1回以上
?? 0回もしくは1回
{n,}? n回以上(nは数字)
{,m}? m回以下(mは数字)
{n,m}? n回以上m回以下(n,mは数字)
以下の例では、最小量指定子を使うことで、(\d+)がマッチする場所を変えています。
/^.(\d+)./.match("Copyright 2013.") # => #< MatchData "Copyright 2013." 1:"3">
/^.?(\d+)./.match("Copyright 2013.") # => #< MatchData "Copyright 2013." 1:"2013">
また、ネストしていない括弧の対応を取るためにも使えます。
ここでは < b> と < /b> の対応を取る
%r{< b>.*< /b>}.match("< b>x< /b>y< b>z< /b>") # => #x< /b>y< b>z< /b>">
%r{< b>.*?< /b>}.match("< b>x< /b>y< b>z< /b>") # => #< MatchData "< b>x< /b>">
絶対最大量指定子(possessive quantifier)
以下のメタ文字列は、最大量指定子のように最長のマッチをしますが、 一度マッチすると、その後マッチに失敗してもバックトラックしません。 つまりマッチ済みの文字列を手放さずにマッチに失敗します。 これらの量指定子は絶対最大量指定子と呼ばれます。
*+ 0回以上
++ 1回以上
?+ 0回もしくは1回
アトミックグループを用いることで同じことができます。