正規表現の繰り返しについて解説するために以下の文字列を用います。
ビル
ビール
ビーール
ビーーール
ビーーーール
ビーーーーール
指定回数繰り返し
本解説において、最も基本的な形は以下になります。
ビー{2,4}ル
意味は、『「ビ」の後ろに「ー」が2~4回続き、「ル」で終わる』です。
つまり、このパターンにおいては、以下の文字列がマッチします。
ビーール
ビーーール
ビーーーール
このように、繰り返す回数を指定する繰り返し方を「指定回数繰り返し」と言います。
{2,4}は「直前の文字を2~4回繰り返す」という意味です。
{2,4}が登場する前の直前の文字は「ー」なので、「ー」が2~4回登場する上記の文字列がマッチします。
※CSVファイルのように、カンマの後にスペースをつけてはいけません!
固定回数繰り返し
上記は2回以上、4回以下という範囲指定の意味ですが、「3回だけ繰り返す。それ以上でも以下でもない」という場合は「{3,3}」としたら良いのでしょうか?
答えはNoです。同じ数字を2回記述する必要はありません。
ビー{3}ル
意味は『「ビ」の後ろに「ー」が3回続き、「ル」で終わる』です。
以下の文字列がマッチします。
ビーーール
無限回数繰り返し
指定回数繰り返しでは、繰り返す回数の下限と上限を指定します。
しかし、下限は決まっているが上限がわからない場合、つまり何回繰り返すかわからない場合は無限回数繰り返しを行います。
ビー{2,}ル
意味は『「ビ」の後ろに「ー」が2回以上続き「ル」で終わる』です。
以下の文字列がマッチします。
ビーール
ビーーール
ビーーーール
ビーーーーール
指定回数繰り返し「{,}」の上限を省略すると、無限回数繰り返しとなり、直前の文字を下限回数以上繰り返すという意味になります。
下限省略
指定回数繰り返しにおいて、上限を省略することで無限回数繰り返しとすることができますが、「{,3}」のように下限は省略できません。
「3回以下の繰り返し」という意味でしたら、以下の記述になります。
ビー{0,3}ル
意味は『「ビ」の後ろに「ー」が0~3回続き、「ル」で終わる』です。
以下の文字列がマッチします。
ビル
ビール
ビーール
ビーーール
ただ、これは最初に解説したパターンと同じですね。
特殊文字による繰り返し
指定回数繰り返しにおいては「{,}」の形式を用いて繰り返しを表現しましたが、正規表現においてよく使う繰り返しは特殊文字で表すことが可能です。
?
「?」は{0,1}と同じ意味になります。
つまり、『直前の文字があってもいいし、なくてもいい』という意味です。
ビー?ル
以下の文字列がマッチします。
ビル
ビール
+
「+」は{1,}と同じ意味になります。
つまり、直前の文字を1回以上繰り返すという意味です。
ビー+ル
以下の文字列がマッチします。
ビール
ビーール
ビーーール
ビーーーール
ビーーーーール
*
「*」(アスタリスク)は{0,}と同じ意味になります。
つまり、直前の文字を0回以上繰り返すという意味です。
ビー*ル
以下の文字列がマッチします。
ビル
ビール
ビーール
ビーーール
ビーーーール
ビーーーーール
正規表現の繰り返しについて、ここまで理解していれば業務で十分使えるレベルです。
ここからはマニアックな知識になりますので、余力がある方のみご覧ください。
最短一致検索(控えめ検索)、欲張り検索
.(ドット)
「.」は正規表現において「なんでもいいから1文字」を表します。
「.+」とすることで、「なんでもいいから1文字以上」という意味になります。
今までは繰り返し対象の直前の文字として「ー」を用いていましたが、最短一致検索を解説するために「ー」を「.」に置き換えて解説します。
以下の文字列を使用します。
ビル
ビール
ビーール
ビーーール
ビーーーール
ビーーーーール
ルビー
ビックル
ビートル
ビ.+ル
意味は『「ビ」の後ろに、なんでもいいから1文字以上が続き、「ル」で終わる』です。
以下の文字列がマッチします。
ビール
ビーール
ビーーール
ビーーーール
ビーーーーール
ビックル
ビートル
欲張り検索
検索対象の文字列に以下を追加します。
ビートルズを愛シテル
先ほどの検索条件で検索すると、結果は以下のようになります。
ビール
ビーール
ビーーール
ビーーーール
ビーーーーール
ビックル
ビートル
ビートルズを愛シテル
「ビートルズを愛シテル」の中には、「ビートル」が含まれており、この部分だけでも「ビ.+ル」のパターンにマッチするのにもかかわらず、行末の「ル」までマッチしていることに注目してください。
この「+」の動作を「欲張り検索」といい、検索パターンにマッチする最長の文字列を取得しようとします。
控えめ検索
検索条件を下記に書き換えることにより、最短一致検索つまり一度「ル」が検出されたらそれ以上の文字列をマッチさせないようにすることができます。
ビ.+?ル
検索結果は以下になります。
「ビートルズを愛シテル」の「ビートル」の部分にのみ黄色背景が付き、それ以降の文字はマッチしていないことに注目していください。
このような動作のことを、欲張り検索に対して「控えめ検索」といいます。
「+」だけでなく「*」と「?」に対しても控えめ検索が存在します。
ビ.*?ル
「ビル」がマッチするようになりました。
「?」についても、標準で欲張り検索の動作をします。
ビ.?
控えめ検索を行うと、最短で一致するようになります。
ビ.??
まとめ
今回は正規表現の繰り返し(量指定子)について解説しました。
本ページの解説が理解できれば、正規表現の繰り返しについては完璧に身についたことになります。
本ページを何度も読み返し、実践していってください。
※正規表現の初心者向けの解説で、わかりやすさを重視したため、一部正確でない表現が入っております。
正規表現についての別記事についてもご覧ください!
★検索
パスワードの正規表現の考え方
「~を含まない行」を検索する方法
「~を含む行」を検索する方法
「~で終わる」を検索する方法
「~で始まる」を検索する方法
正規表現繰り返しの考え方
最短一致検索を行う方法
否定の文字クラス
「または」検索を行う方法
環境による「\d」の動作の違いについて検証
★置換
正規表現置換の考え方
大文字⇔小文字変換を行う方法
キャメルケース⇔スネークケース変換を行う方法
CSVを囲みなし⇒囲みありに変換する方法
CSVファイルの特定のカンマ以降を削除する方法
CSVファイルの必要な箇所だけ残す方法
数字3ケタおきにカンマを挿入する方法
正規表現置換で不要な行を削除し、必要な行だけ残す方法
数字を0埋めする方法
0埋めされた数字を0埋めなしに変換する方法
ファイル名から、拡張子のみを抽出する方法
Javaで正規表現置換を行う方法
また、Udemyという動画教育プラットフォームで動画解説を行っております。
動きを確認しながら丁寧に学習したいという方は、ぜひご覧ください!
コメント