基本的な正規表現について、今回はアスタリスク「*」の意味についてです。
正規表現のアスタリスク「*」とは?
正規表現でアスタリスク「*」は、「直前のパターンの0回以上の繰り返し」という意味です。
最も簡単な正規表現の例は、
// a を0回以上繰り返す正規表現
abc*
この正規表現は、下記を全てマッチします。
ab // マッチ。「c」の0回の繰り返し
abc // マッチ。「c」の1回の繰り返し
abccccc // マッチ。「c」の5回の繰り返し
アスタリスク「*」のような繰り返し回数を制御するメタ文字は、「量化子」「量指定子」などと呼ばれる事があります。
アスタリスク「*」のような量化子では「最初に見つかる」「最長の一致」が優先的にマッチされます。 下記のアスタリスクを使ったパターン例では、最初に見つかった「〜の0回の繰り返し」、すなわち「空文字」が一番初めにマッチします。 この空文字は、テスト対象文字列の「あ」から始まる文字列の吟味においてマッチします。「あ」から始まる文字列の吟味が終われば、その次に、「〜」から始まる文字列の吟味が開始されます。 「最初の一致」はあくまで「空文字」になります。(この2番目の吟味は「〜〜〜」をマッチします) 下記のアスタリスクを使ったパターン例では、「あ」ではなく、同時にマッチする最長の「あ〜〜〜」がマッチします。これは吟味の際には最も回数の多いマッチが優先される「Greedy (欲張りな)マッチ」と呼ばれるます。 最初の一致・最長の一致は、知っておくべき、大切な仕様じゃな。 アスタリスク「*」を始めとする、+, ?, {n, m} のような量化子では、その直後に「?」をつけると、最短の一致をマッチするようになります。 量化子の一覧です。正規表現の量化子
アスタリスクを含め、正規表現には、下記のような量化子があります。
アスタリスクは「最初の一致」「最長の一致」
最初の一致
// 正規表現
〜*
// テスト対象
あ〜〜〜!驚いた。
// 最初のマッチ
(空文字)
最長の一致
// 正規表現
あ〜*
// テスト対象
あ〜〜〜!驚いた。
// 最初の最長のマッチ
あ〜〜〜
【参考】アスタリスクを使った「最短の一致」
/ 正規表現
あ〜*?
// テスト対象
あ〜〜〜!驚いた。
// 最初の、最短のマッチ
あ
量指定子(最長一致) 最短一致 意味 * *? 直前のパターンの0回以上連続 + +? 直前のパターンの1回以上連続 ? ?? 直前のパターンの0回か1回の出現 {N} - 直前のパターンのN回の連続 {min,} {min,}? 直前のパターンのmin回以上の連続 {,max} {,max}? 直前のパターンのmax回以下の連続 {min,max} {min,max}? 直前のパターンのmin回からmax回の連続
たまに、どれがどれだったのか、ど忘れしちゃうんだよね・・