コンテンツにスキップ

正規表現

正規表現(せいきひょうげん)とは?

  • 文字列を検索するときに使う特殊な書き方のこと
    • 英語ではRegular Expression
  • . (ドット)や * (アスタリスク)、 ? (クエスチョンマーク)、 ^ (キャレット)、 $ (ドルマーク)など特殊な意味を持つ メタ文字 を使用する
  • たいていのプログラミング言語でほぼ同じ書き方で使用できる
    • ただし以下の点には要注意
      • プログラミング言語によって日本語の扱いが異なることが多い。
      • 探した(マッチした)文字列をどう扱うかなどは言語によってかなり違う。言語ごとのマニュアルを読もう。

こんなときに便利!

  • 「竹林 暁」(全角空白)でも「竹林 暁」(半角空白)でも「竹林暁」でも同じものとして検索したい
  • 「スーパーマン」は除いて「パーマン」を検索したい
  • パスワードに大文字アルファベットが含まれるかチェックしたい

正規表現の例

正規表現意味
`(みそ塩)ラーメン`
.の呼吸1文字のあとに「の呼吸」が来る(「水の呼吸」、「炎の呼吸」など)
[0-9]{5}数字からなる5文字。12340や44356など

基本的な正規表現

1文字

正規表現意味
.なにか1文字(改行以外)b.t (batやbutなどbとtの間になにか1文字が入る)
[…][]内の1文字

[abc] (aかbかc)

[a-zA-Z] (アルファベットのどれか)

[^…][]内に含まれない1文字[^0-9] (数字以外の文字)
\s空白文字(半角空白、全角空白、タブ文字など)竹林\s暁 (「竹林 暁」「竹林 暁」など)
\w半角数字と半角アルファベット\w\w\w (02a、Ae4など半角の数字とアルファベット3文字)
\n改行文字

繰り返し

正規表現意味
*0回以上の繰り返し.* (改行以外の文字がいくつあってもマッチ。なくてもよい)
+1回以上の繰り返し[0-9]+ (数字が1個以上)
?0回か1回富士山? (「富士」または「富士山」)
{n}n回の繰り返し(おい){2} (「おいおい」を表す)
{n,m}n回以上m回までの繰り返し[0-9]{3,5} (3桁から5桁までの数字)

その他

正規表現意味
^文字列(行)の先頭^03 (03で始まる行)
$文字列(行)の最後なり。$ (「なり。」で終わる行)
|または(みそ|塩|醤油)ラーメン ( 「みそラーメン」または「塩ラーメン」または「醤油ラーメン」 )
\メタ文字の意味を変える

\. (ピリオドそのもの)

\\(\そのもの)

正規表現を作ってみよう

実際にWeb上のツールで試してみましょう

正規表現チェッカー

JavaScriptの正規表現を試せる日本のサイト

regular expressions 101

Python、JavaScript、PHPなどたくさんの言語の正規表現を試せる

やってみよう

  1. ストロベリーチョコケーキやストロベリーアイスケーキなど、「ストロベリー」と「ケーキ」の間に何かが入る文字を探す正規表現を作ってください。

    解答例 ストロベリー.+ケーキ

  2. 自分の住む地域の電話番号を表す正規表現を作ってください。自分の地域の電話番号がわからない人は090からはじまる携帯電話の電話番号で。

    解答例 (03)-[0-9]{{4}-[0-9]{4}

  3. 2で、途中にハイフン(-)が入っていてもなくても対応できるようにしてください。

    解答例 (03)-?[0-9]{4}-?[0-9]{4}

  4. 「竹林暁」でも「竹林 暁」(半角スペース)でも「竹林 暁」(全角スペース)でもマッチする正規表現を作ってください。

    解答例
    竹林\s?暁

  5. 「スーパーマン」にはマッチしないけれど「パーマン」にはマッチする正規表現を作ってください。ただし「スーパーマン」や「パーマン」の前に文字はないとします。

    解答例 ^パーマン

応用的な話題

欲張りマッチ

長野県.+市 という正規表現で”長野県佐久市”や”長野県軽井沢市”などにマッチさせたいとしましょう。このとき、「長野県飯田市佐藤市長」という文字を対象にしてマッチさせると、「長野県飯田市佐藤市」がマッチします。.+市は、「飯田市」で終わらず、「飯田市佐藤市」まで見つけてしまいます。これは、通常のマッチは、「見つかる限り一番長いマッチ」を見つけるという欲張りな特徴があるからです。

そこで、 長野県.+?市 のように+に?をつけると、「見つかる限り一番短いマッチ」を見るけるようになります。今回の場合「長野県飯田市」がマッチします。試してみましょう。

同じものの出現

“Hello World”や’Bye bye’のように、ダブルクオートかシングルクオートで囲まれた文字列にマッチさせようとして、 ["'].+?["'] という正規表現を作ったとします。これは一見正しそうに見えますが、実際には’Hello”のように、シングルクオートとダブルクオートの組み合わせでもマッチしてしまいます。こういう場合は、 ()\1 を用います。 () に囲まれた正規表現がマッチした内容が \1 に入るのです。

今回の場合は、 (["']).+?\1 のようにして、 ["']() で囲むことで、最初にマッチしたダブルクオートかシングルクオートが\1に入りますので、必ずダブルクオートかシングルクオート同士の組み合わせになります。このようなやりかたを 後方参照 と言います。

やってみよう

同じ数字でできた3桁の数を探す正規表現を作ってください。

解答例 ([0-9])\1{2}

「ない」を表現する

「パーマン」にマッチさせたいとき、「スーパーマン」を除外する工夫として、 ^パーマン という正規表現の書き方がありますが、これはパーマンが文中にあった場合に検出できないという問題があります。そこで、()と?を使った特殊な書き方を使います。

(?<!スー)パーマン という正規表現を使うことで、前に「スー」がつかない「パーマン」だけを検索することができます。

正規表現意味
(?<!…)前に…がつかない(?<!スー)パーマン (前に「スー」がつかない「パーマン」)
(?!…)後ろに…がつかないハッカ(?!ー) (うしろに「ー」がつかない「ハッカ」)

正規表現についての資料リンク