正規表現において、任意の文字列のマッチング方法についてまとめました。
目次
正規表現を使った任意の文字列の表現
正規表現は「リテラル」とよばれる通常の文字表現と「メタ文字」と呼ばれる特別な意味を持つ文字を使って、文字の発生のルール、すなわち「パターン」を記述する方法です。
簡単な例から見ていきましょう。
リテラルと、メタ文字(特殊文字)
リテラルは通常の文字です。「山」とかけば「山」に、「海」とかけば「海」マッチする文字を意味します。
// 「山頭火」 という文字列をマッチする表現
/山頭火/
// マッチする文字列
山頭火
一方で、メタ文字はリテラルと異なり、特別な意味を持つメタ文字があります。例えば「.(ドット)」は、「改行以外の任意の文字」を意味します。
// 3文字の任意の文字
/.../
// マッチする文字列
一風堂
山頭火
レレレ
あらら
やまや
パターンの「繰り返し回数」を指定する
直前のパターンを繰り返しを指定するメタ文字があります。代表的なものに「*」があり、これは「直前のパターンの0回か、1回以上の繰り返し」を意味します。
// あで始まり、任意の文字の繰り返し。
/ あ.*/
あ
あああああ
あ〜〜〜〜っ。
あれま。
あっ、ラーメンがいい。
このようなパターンの繰り返しの指定するメタ文字を「量指定子」と呼ぶことがあります。
量指定子の一覧
量指定子(最長一致) | 最短一致 | 意味 |
* | *? | 直前のパターンの0回以上連続 |
+ | +? | 直前のパターンの1回以上連続 |
? | ?? | 直前のパターンの0回か1回の出現 |
{N} | - | 直前のパターンのN回の連続 |
{min,} | {min,}? | 直前のパターンのmin回以上の連続 |
{,max} | {,max}? | 直前のパターンのmax回以下の連続 |
{min,max} | {min,max}? | 直前のパターンのmin回からmax回の連続 |
もし対象のパターンを拡大したい時は、()、もしくは(: )を使ってグルーピングします。
// あで始まり、任意の文字の繰り返し。
/(.こ)*/
ここ
どこそこ
たこ
アンカーによる文字の発生位置の指定
文字の「発生位置」を指定するメタ文字もあります。代表的なものに「^」「$」があります。それぞれ「行頭」「行末」を表します。
// 行末と行頭を指定。
/^今日.+!$/
// マッチする文字列
今日は最高の一日でした!
今日は晴れるといいな!
今日こそは勝つぞ〜っ!
// マッチしない文字列
ああ、今日は疲れたな! // 今日が行頭でない
今日はもういいの!? // !が行末でない
行末、行頭の定義が「改行までを1行とする」のか、「ファイル内文字列全体の末尾まで」なのかは、プログラミング言語(正規表現のエンジン)の仕様に依存します。使っている言語の仕様をよく確認するようにしてください。
メタ文字の一覧は、こちらの記事もご覧ください。
〜を含む任意の文字列
〜を含む、といった、部分一致はやや複雑な記述が必要になります。
// 「だけど」を含む文字列
/^(?=.*けど).*$/
// マッチする文字列
晴れだけど、雨。
だけど、いいかんじ。
てか、もういいんだけど
「(?=」「)」は肯定先読みと呼ばれる、括弧内の条件を満たすような位置を検索するパターンの記述方法です。状況を満たす位置が見つかれば、そこから正規表現の処理を再開します。上記では、文頭の直後から前方を検索し、「・・・けど」とマッチする文字列が見つかれば、文頭の直後から処理を再開します。逆に見つからなければ、正規表現全体はマッチしません。
肯定先読みは、やや初学者には難解かもしれません。合わせて、こちらの記事をご覧ください。
参考情報
こちらに、正規表現の基本をまとめています。初学者の方はぜひご覧ください。
また「〜を含まない」といったケースはより高度な表現が必要です。こちらをご参照ください。
「.」は、いわゆるワイルドカードのように働くんだね。