0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

正規表現 繰り返し

Posted at

以下のメタ文字列は繰り返しを表現します。 直前の部分式を何回繰り返すかを指定します。このような繰り返しを 表すメタ文字列を量指定子(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回
アトミックグループを用いることで同じことができます。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?