正規表現には、文字の繰り返しを表現するパターンを指定するためのメタキャラクタ(メタ文字)がいくつか用意されています。
文字の繰り返しを検索する正規表現を使うことで、重複した文字(綴り間違い)を探し出したり、置換したりすることができます。
また、連続する複数の半角スペースをタブに変換することも容易に実行できます。
文字の繰り返しの正規表現パターンを指定した検索は、正規表現の基本のひとつですので、正規表現を使いこなすためには、優先して習得したい技術です。
そこで今回は、正規表現パターンの中でもよく使われる、文字の繰り返しを表すメタキャラクタについて紹介します。
目次
- 1 文字の繰り返しを表すメタキャラクタ
- 1.1 直前の文字の0回以上の繰り返しを表す「*」
- 1.2 直前の文字の1回以上の繰り返しを表す「+」
- 1.3 直前の文字の0回または1回の出現を表す「?」
- 1.4 直前の文字のn回の繰り返をしを表す「{n}」
- 1.5 直前の文字のn回以上の繰り返をしを表す「{n,}」
- 1.6 直前の文字のn回以上m回以下の繰り返をしを表す「{n,m}」
- 1.7 直前に置かれている文字の0回以上の繰り返しを表す「*?」
- 1.8 直前に置かれている文字の1回以上の繰り返しを表す「+?」
- 1.9 直前に置かれている文字の0回または1回の出現を表す「??」
- 1.10 直前の文字のn回以上の繰り返をしを表す「{n,}?」
- 1.11 直前の文字のn回以上m回以下の繰り返をしを表す「{n,m}?」
- 2 文字列を表す正規表現パターン
文字の繰り返しを表すメタキャラクタ
直前の文字の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回以上繰り返す「+」を続けて指定することで、任意の文字列にマッチさせることができます。
例えば「お.+し」と指定した場合は、「おもし」「おもらし」「おもてなし」などと一致させることができます。
「お.*し」を指定した場合に一致した「おし」とは一致しません。