正規表現の基本とメタキャラクタ

正規表現

PC(パソコン)を使用していると、キーワードを使った文字や文字列の検索を行います。
キーワードによる検索では、検索条件に一致する文字列がテキストデータに含まれている場合にのみ、検索が成功します。
テキスト形式のデータ(ファイル内の文字列)をキーワードを使って検索することで、探したいデータを素早く見つけることができます。

テキスト形式のファイルを処理する場面では、特に活躍することの多いテキストエディタなどには、キーワードを使った検索機能に「正規表現」という形式を指定して検索できる仕組みが用意されています。

今回は、その正規表現についての基本について紹介したいと思います。

目次

正規表現とは

文字列の集合(いくつかの文字列が集まった文字列)を「一つの文字列」で表現するための方法で、文字列の中に見つけることができる「パターン」を文字列で表現する記述形式です。「パターン」として記述することにより、文字列の集合から「パターン」にマッチする複数の文字列を見つけることができます。また、「パターン」化することにより、文字列の集合にの中の一部または全部に一致する文字列を、シンプルに表現することができます。

パターンについて

パターンとはある文字列中にある「規則性」や「ルール」または「条件」などを表現したものになります。
例えば「吾輩は猫である。 名前はまだ無い。」という文字列があった場合に、「吾輩」で始まる文字列、「猫」と「名前」を含む文字列、「無い。」で終わる文字列などを文字列を使って表したものがパターンです。
パターンは、通常の文字列と特殊文字によって表現されます。

正規表現のパターン例
条件 パターン文字列
「吾輩」で始まる文字列 ^吾輩.*
「猫」または「名前」を含む文字列 .*[猫|(名前)].*
「無い。」で終わる文字列 .*無い。$

上記の例での特殊文字は「.」「*」「[」「]」「|」「(」「)」「^」「$」になります。
正規表現では、この特殊文字のことを「メタキャラクタ」といい、「.」「*」「[」「]」「|」「(」「)」「^」「$」以外にも様々なメタキャラクタがあります。

正規表現のメタキャラクタの種類について

メタキャラクタ(メタ文字)には、文字または文字列および文字列の集合を表すもの、文字列内の位置を表すもの、文字列の繰り返しを表すもの、範囲を表すもの、選択を表すもの、後方参照を行うもの、先読み・後読み(前後読み)を行うもの等があります。

文字を表すメタキャラクタ

ここでは、任意の文字を検索する正規表現について紹介します。

任意の1文字を表す「.」

「.」は任意の1文字と一致します。任意の1文字には空文字が含まれますので、実質0文字とも一致します。

例えば「…」であれば、「abc」「ABC」「123」「A01」「Yes」「あいう」などにマッチする正規表現を表していることになります。
「おかし」「おすし」「おぬし」「おはし」「おもし」「おろし」にマッチさせるのであれば、「お.し」と指定することで認識させることができます。

文字の繰り返しを表すメタキャラクタ(最長一致)

ここでは、文字の繰り返しを指定する正規表現について紹介します。

0回以上の繰り返しにマッチする「*」

「*」は直前に置かれている文字の0回以上の繰り返しに一致します。直前に文字が置かれている必要がありますので、「*」は単独では正規表現としての意味をなしません。

例えば「Yaho*!」であれば、「Yaho!」「Yahoo!」「Yahoooo!」「Yah!」などにマッチします。

1回以上の繰り返しにマッチする「+」

「+」は直前に置かれている文字の1回以上の繰り返しに一致します。直前に文字が置かれている必要がありますので、「+」も単独では正規表現としての意味をなしません。

例えば「Yaho+!」であれば、「Yaho!」「Yahoo!」「Yahoooo!」などにマッチします。
必ず1回は繰り返しが必要なので、「*」を指定した場合に一致する「Yah!」とはマッチしません。

0回または1回の出現にマッチする「?」

「?」は直前に置かれている文字の0回または1回の出現に一致します。直前に文字が置かれている必要がありますので、「?」も単独では正規表現としての意味をなしません。

例えば「Yahoo?!」であれば、「Yaho!」または「Yahoo!」とマッチします。

n回(指定した回数)の繰り返しにマッチする「{n}」

「{n}」は直前に置かれている文字のn回(nは回数を表す数値)の繰り返しに一致します。直前に文字が置かれている必要がありますので、「{n}」も単独では正規表現としての意味をなしません。

例えば「Yaho{2}!」であれば、「Yahoo!」とマッチします。

n回(指定した回数)以上の繰り返しにマッチする「{n,}」

「{n,}」は直前に置かれている文字のn回以上(nは回数を表す数値)の繰り返しに一致します。直前に文字が置かれている必要がありますので、「{n,}」も単独では正規表現としての意味をなしません。

例えば「Yaho{2,}!」であれば、「Yahoo!」「Yahooo!」「Yahooooo!」などとマッチします。

n回以上m回以下(指定した回数の範囲)の繰り返しにマッチする「{n,m}」

「{n,m}」は直前に置かれている文字のn回以上、m回以下(nとmは回数を表す数値)の繰り返しに一致します。直前に文字が置かれている必要がありますので、「{n,m}」も単独では正規表現としての意味をなしません。

例えば「Yaho{2,4}!」であれば、「Yahoo!」「Yahooo!」「Yahoooo!」とマッチします。

一致する範囲

「*」「+」「?」「{n}」「{n,}」「{n,m}」の各メタキャラクタは可能な限り大きい範囲のパターンにマッチする最長一致になります。また、正規表現にはできる限り小さい範囲のパターンにマッチする最短一致もあります。

最長一致、最短一致の詳細については、以下の記事を参照してください。

https://johobase.com/longest-shortest-match-regular-expression

文字の繰り返しを表すメタキャラクタ(最短一致)

ここでは、文字の繰り返しを表す正規表現(最短一致を表す量指定子)について紹介します。
ここで紹介するメタキャラクタは、「*」「+」「?」「{n,}」「{n,m}」の末尾に「?」を不可した正規表現になります。

0回以上の繰り返しにマッチする「*?」

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

1回以上の繰り返しにマッチする「+?」

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

0回または1回の出現にマッチする「??」

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

n回(指定した回数)以上の繰り返しにマッチする「{n,}?」

「{n,}?」は「{n,}」と同様に、直前に置かれている文字のn回以上(nは回数を表す数値)の繰り返しに一致します。

n回以上 m回以下(指定した回数の範囲)の繰り返しにマッチする「{n,m}?」

「{n,m}?」は「{n,m}」と同様に、直前に置かれている文字のn回以上、m回以下(nとmは回数を表す数値)の繰り返しに一致します。

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

ここでは、文字列を検索する正規表現について紹介します。

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

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

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

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

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

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

メタキャラクタのエスケープ

ここでは、他のメタキャラクタ(正規表現記号)をエスケープする正規表現について紹介します。

メタキャラクタをエスケープする「\」

「\」は直後のメタキャラクタをエスケープします。

例えば「Ya\+hoo」は「Ya+hoo」とマッチします。ここでの「+」は、直前の文字の1回以上の繰り返しを表す「+」ではなく、文字としての「+」として扱われます。

文字列内の位置を表すメタキャラクタ

ここでは、文字列内の位置を指定する正規表現について紹介します。

文字列の先頭を表す「^」

「^」は文字列の先頭(最初)に一致します。

例えば「^b」であれば、「b」で始まる行の先頭にマッチします。

文字列の末尾または改行の直前を表す「$」

「$」は文字列の末尾(最後)、または改行の直前に一致します。

例えば「e$」であれば、「e」で終わる行の末尾にマッチします。

その他のメタキャラクタ

ここでは、上記以外の正規表現について紹介します。

左右のいずれか正規表現を表す「|」

「|」は左右のいずれかに指定された条件に一致します。(OR条件)

例えば「Ya(hoo|hho)!」であれば、「Yahoo!」または「Yahho!」とマッチします。

指定された文字または文字の範囲の1文字を表す「[…]」

「[…]」は各括弧([])内に指定された文字のいずれか1文字に一致します。
各括弧内には、文字または文字の範囲を指定することができます。

例えば「[abc]」であれば、「a」「b」「c」のいずれか1文字とマッチします。
上記の「a」「b」「c」とのマッチを範囲として指定する場合は「[a-c]」のように「-(ハイフン)」を使って指定します。

指定された文字または文字の範囲の文字以外を表す「[^…]」

「[^…]」は各括弧([])内に指定された文字のすべてに一致しない文字にマッチします。
「[^…]」での文字の指定は「[…]」と同様です。

例えば「^[xyz]」であれば、「x」「y」「z」以外の文字とマッチします。
「^[xyz]」を範囲指定形式で記述すると「^[x-z]」となります。

文字をグループ化する「(…)」

文字を1つのグループにまとめてグループ化することができます。

例えば「(abc)+」であれば、文字列の「abc」が1回以上の繰り返される文字列にマッチします。

定義済みの正規表現メタキャラクタ

文字 説明 別の表現方法
¥0 NULL文字
\A 文字列の先頭(ファイルの先頭)
\b 単語の境界(単語の先頭および末尾)
\B 単語の境界以外
\d 数字 [0-9]
\D 数字以外の文字 [^0-9]
\f 改ページ
\n 改行: ラインフィード(LF)
\r 復帰: キャリッジ・リターン(CR)
\t タブ
\s 空白文字(垂直タブを除く) [ \t\f\r\n]
\S 空白文字以外 [^ \t\f\r\n]
\v 垂直タブ
\w 英数字とアンダースコア [a-zA-Z_0-9]
\W 英数字とアンダースコア以外 [^a-zA-Z_0-9]
\z 文字列の末尾(ファイルの末尾)
\Z 文字列の末尾または改行の直前