正規表現:任意の文字列のマッチング

最終更新:2018-08-02 by Joe

正規表現において、任意の文字列のマッチング方法についてまとめました。

正規表現を使った任意の文字列の表現

正規表現は「リテラル」とよばれる通常の文字表現と「メタ文字」と呼ばれる特別な意味を持つ文字を使って、文字の発生のルール、すなわち「パターン」を記述する方法です。

簡単な例から見ていきましょう。

リテラルと、メタ文字(特殊文字)

リテラルは通常の文字です。「山」とかけば「山」に、「海」とかけば「海」マッチする文字を意味します。

// 「山頭火」 という文字列をマッチする表現
/山頭火/

// マッチする文字列
山頭火

一方で、メタ文字はリテラルと異なり、特別な意味を持つメタ文字があります。例えば「.(ドット)」は、「改行以外の任意の文字」を意味します。

// 3文字の任意の文字
/.../

// マッチする文字列
一風堂
山頭火
レレレ
あらら
やまや

「.」は、いわゆるワイルドカードのように働くんだね。

パターンの「繰り返し回数」を指定する

直前のパターンを繰り返しを指定するメタ文字があります。代表的なものに「*」があり、これは「直前のパターンの0回か、1回以上の繰り返し」を意味します。

// あで始まり、任意の文字の繰り返し。

/ あ.*/

あ
あああああ
あ〜〜〜〜っ。
あれま。
あっ、ラーメンがいい。

このようなパターンの繰り返しの指定するメタ文字を「量指定子」と呼ぶことがあります。

量指定子の一覧

量指定子(最長一致)最短一致意味
**?直前のパターンの0回以上連続
++?直前のパターンの1回以上連続
???直前のパターンの0回か1回の出現
{N} - 直前のパターンのN回の連続
{min,}{min,}?直前のパターンのmin回以上の連続
{,max}{,max}?直前のパターンのmax回以下の連続
{min,max}{min,max}?直前のパターンのmin回からmax回の連続

もし対象のパターンを拡大したい時は、()、もしくは(:  )を使ってグルーピングします。

// あで始まり、任意の文字の繰り返し。
/(.こ)*/

ここ
どこそこ
たこ

アンカーによる文字の発生位置の指定

文字の「発生位置」を指定するメタ文字もあります。代表的なものに「^」「$」があります。それぞれ「行頭」「行末」を表します。

// 行末と行頭を指定。
/^今日.+!$/

// マッチする文字列
今日は最高の一日でした!
今日は晴れるといいな!
今日こそは勝つぞ〜っ!

// マッチしない文字列
ああ、今日は疲れたな! // 今日が行頭でない
今日はもういいの!? // !が行末でない

行末、行頭の定義が「改行までを1行とする」のか、「ファイル内文字列全体の末尾まで」なのかは、プログラミング言語(正規表現のエンジン)の仕様に依存します。使っている言語の仕様をよく確認するようにしてください。

メタ文字の一覧は、こちらの記事もご覧ください。

〜を含む任意の文字列

〜を含む、といった、部分一致はやや複雑な記述が必要になります。

// 「だけど」を含む文字列
/^(?=.*けど).*$/

// マッチする文字列
晴れだけど、雨。
だけど、いいかんじ。
てか、もういいんだけど

「(?=」「)」は肯定先読みと呼ばれる、括弧内の条件を満たすような位置を検索するパターンの記述方法です。状況を満たす位置が見つかれば、そこから正規表現の処理を再開します。上記では、文頭の直後から前方を検索し、「・・・けど」とマッチする文字列が見つかれば、文頭の直後から処理を再開します。逆に見つからなければ、正規表現全体はマッチしません。

肯定先読みは、やや初学者には難解かもしれません。合わせて、こちらの記事をご覧ください。

参考情報

こちらに、正規表現の基本をまとめています。初学者の方はぜひご覧ください。

また「〜を含まない」といったケースはより高度な表現が必要です。こちらをご参照ください。