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 | 文字列の末尾または改行の直前 |