正規表現で文字の繰り返しを表すメタキャラクタ

正規表現

正規表現には、文字の繰り返しを表現するパターンを指定するためのメタキャラクタ(メタ文字)がいくつか用意されています。

文字の繰り返しを検索する正規表現を使うことで、重複した文字(綴り間違い)を探し出したり、置換したりすることができます。
また、連続する複数の半角スペースをタブに変換することも容易に実行できます。

文字の繰り返しの正規表現パターンを指定した検索は、正規表現の基本のひとつですので、正規表現を使いこなすためには、優先して習得したい技術です。

そこで今回は、正規表現パターンの中でもよく使われる、文字の繰り返しを表すメタキャラクタについて紹介します。

文字の繰り返しを表すメタキャラクタ

直前の文字の0回以上の繰り返しを表す「*」

「*」は直前に置かれている文字(要素)が、0回以上の繰り返されている文字列と一致します。

例えば「Yaho*」であれば、「Yahoo」や「Yahoooooo」とマッチします。
また、「Yaho*」という正規表現は「Yah」にもマッチします。繰り返しの回数が0回(以上)なので、繰り返す対象の文字(ここでは「o」)が存在しなくても一致するのです。

メタキャラクタの「*」は、直前に文字が置かれている必要がありますので、単独では機能しません。

「*」は可能な限り大きい範囲とパターンにマッチする最長一致になります。

直前の文字の1回以上の繰り返しを表す「+」

「+」は直前に置かれている文字(要素)が、1回以上の繰り返されている文字列と一致します。

例えば「G*gle」であれば、「Google」や「Goooooogle」とマッチします。
また、「Gogle」とはマッチしますが「Ggle」とはマッチしません。繰り返しの回数が1回以上なので、繰り返す対象の文字(ここでは「o」)が存在する場合のみ一致します。

「+」も「*」と同様に、単独では機能しません。必ず直前に文字を指定する必要があります。

「+」は可能な限り大きい範囲とパターンにマッチする最長一致になります。

直前の文字の0回または1回の出現を表す「?」

「?」は直前に置かれている文字(要素)が、0回または1回出現する文字列と一致します。

例えば「ab?」は、「a」または「ab」とマッチします。
「?」は、カタカナ表記によくある「フォルダー」と「フォルダ」や、「ユーザー」と「ユーザ」などの、最後の「ー」の有無を区別せず、両方の文字列にマッチさせたい場合などに使用できます。「フォルダー」と「フォルダ」であれば、正規表現は「フォルダ?」となり、「ユーザー」と「ユーザ」であれば、「ユーザ?」になります。(全角文字を1文字として扱わない環境では、「ー」の有無を区別せずに一致させることはできませんので、注意が必要です。)

「?」も「*」と同様に、単独では機能しません。必ず直前に文字を指定する必要があります。

「?」は可能な限り大きい範囲とパターンにマッチする最長一致になります。

直前の文字のn回の繰り返をしを表す「{n}」

「{n}」は直前に置かれている文字(要素)が指定した回数(ここではn)出現する文字列と一致します。
回数nには数値を指定します。

例えば「Yaho{2}!」と指定した場合は、「Yahoo!」に一致します。

「{n}」も「*」と同様に、単独では機能しません。必ず直前に文字を指定する必要があります。

直前の文字のn回以上の繰り返をしを表す「{n,}」

「{n,}」は直前に置かれている文字(要素)が指定した回数(ここではn)以上出現する文字列と一致します。
回数nには数値を指定します。

例えば「Yaho{2,}!」と指定した場合は、「Yaho{2}!」と指定した場合と同様に「Yahoo!」に一致します。
また、2回以上の指定なので、「Yahooo!」や「Yahooooo!」「Yahoooooooo!」などにも一致します。

「{n,}」は可能な限り大きい範囲とパターンにマッチする最長一致になります。

「{n,}」も「*」と同様に、単独では機能しません。必ず直前に文字を指定する必要があります。

直前の文字のn回以上m回以下の繰り返をしを表す「{n,m}」

「{n,m}」は直前に置かれている文字(要素)が指定した回数の範囲(ここではn~m)で出現する文字列と一致します。
回数n, mに指定する値は数値になります。

例えば「Yaho{2,4}」と指定した場合は、「Yahoo」に一致します。
また、2回以上4回以下の指定なので、「Yahooo!」と「Yahoooo!」にも一致します。

「{n,m}」は可能な限り大きい範囲とパターンにマッチする最長一致になります。

「{n,m}」も「*」と同様に、単独では機能しません。必ず直前に文字を指定する必要があります。

直前に置かれている文字の0回以上の繰り返しを表す「*?」

「*?」は「*」と同様に、直前に置かれている文字が、0回以上の繰り返されている文字列と一致します。

「*?」は「*」を指定した時の最長一致を避け、最短一致になります。

「*?」も「*」と同様に、単独では機能しません。必ず直前に文字を指定する必要があります。

直前に置かれている文字の1回以上の繰り返しを表す「+?」

「+?」は「+」と同様に、直前に置かれている文字が、1回以上の繰り返されている文字列と一致します。

「+?」は「+」を指定した時の最長一致を避け、最短一致になります。

「+?」も「+」と同様に、単独では機能しません。必ず直前に文字を指定する必要があります。

直前に置かれている文字の0回または1回の出現を表す「??」

「??」は「?」と同様に、直前に置かれている文字が、0回または1回出現する文字列と一致します。

「??」は「?」を指定した時の最長一致を避け、最短一致になります。

「??」も「?」と同様に、単独では機能しません。必ず直前に文字を指定する必要があります。

直前の文字のn回以上の繰り返をしを表す「{n,}?」

「{n,}?」は「{n,}」と同様に、直前に置かれている文字(要素)が指定した回数(ここではn)以上出現する文字列と一致します。

「{n,}?」は「{n,}」を指定した時の最長一致を避け、最短一致になります。

「{n,}?」も「{n,}」と同様に、単独では機能しません。必ず直前に文字を指定する必要があります。

直前の文字のn回以上m回以下の繰り返をしを表す「{n,m}?」

「{n,m}?」は「{n,m}」と同様に、直前に置かれている文字(要素)が指定した回数の範囲(ここではn~m)で出現する文字列と一致します。

「{n,m}?」は「{n,m}」を指定した時の最長一致を避け、最短一致になります。

「{n,m}?」も「{n,m}」と同様に、単独では機能しません。必ず直前に文字を指定する必要があります。

文字列を表す正規表現パターン

0文字以上の任意の文字列を表す「.*」

空文字を含む任意の1文字を表す「.」と、直前の文字を0回以上繰り返す「*」を続けて指定することで、空文字列を含む任意の文字列にマッチさせることができます。

例えば「お.*し」と指定した場合は、「おし」「おもし」「おもらし」「おもてなし」などと一致させることができます。

1文字以上の任意の文字列を表す「.+」

空文字を含む任意の1文字を表す「.」と、直前の文字を1回以上繰り返す「+」を続けて指定することで、任意の文字列にマッチさせることができます。

例えば「お.+し」と指定した場合は、「おもし」「おもらし」「おもてなし」などと一致させることができます。
「お.*し」を指定した場合に一致した「おし」とは一致しません。