正規表現
正規表現(せいきひょうげん)とは?
- 文字列を検索するときに使う特殊な書き方のこと
- 英語ではRegular Expression
.
(ドット)や*
(アスタリスク)、?
(クエスチョンマーク)、^
(キャレット)、$
(ドルマーク)など特殊な意味を持つ メタ文字 を使用する- たいていのプログラミング言語でほぼ同じ書き方で使用できる
- ただし以下の点には要注意
- プログラミング言語によって日本語の扱いが異なることが多い。
- 探した(マッチした)文字列をどう扱うかなどは言語によってかなり違う。言語ごとのマニュアルを読もう。
- ただし以下の点には要注意
こんなときに便利!
- 「竹林 暁」(全角空白)でも「竹林 暁」(半角空白)でも「竹林暁」でも同じものとして検索したい
- 「スーパーマン」は除いて「パーマン」を検索したい
- パスワードに大文字アルファベットが含まれるかチェックしたい
正規表現の例
正規表現 | 意味 |
---|---|
`(みそ | 塩)ラーメン` |
.の呼吸 | 1文字のあとに「の呼吸」が来る(「水の呼吸」、「炎の呼吸」など) |
[0-9]{5} | 数字からなる5文字。12340や44356など |
基本的な正規表現
1文字
正規表現 | 意味 | 例 |
---|---|---|
. | なにか1文字(改行以外) | b.t (batやbutなどbとtの間になにか1文字が入る) |
[…] | []内の1文字 |
|
[^…] | []内に含まれない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などたくさんの言語の正規表現を試せる
やってみよう
-
ストロベリーチョコケーキやストロベリーアイスケーキなど、「ストロベリー」と「ケーキ」の間に何かが入る文字を探す正規表現を作ってください。
解答例
ストロベリー.+ケーキ
-
自分の住む地域の電話番号を表す正規表現を作ってください。自分の地域の電話番号がわからない人は090からはじまる携帯電話の電話番号で。
解答例
(03)-[0-9]{{4}-[0-9]{4}
-
2で、途中にハイフン(-)が入っていてもなくても対応できるようにしてください。
解答例
(03)-?[0-9]{4}-?[0-9]{4}
-
「竹林暁」でも「竹林 暁」(半角スペース)でも「竹林 暁」(全角スペース)でもマッチする正規表現を作ってください。
解答例
竹林\s?暁
-
「スーパーマン」にはマッチしないけれど「パーマン」にはマッチする正規表現を作ってください。ただし「スーパーマン」や「パーマン」の前に文字はないとします。
解答例
^パーマン
応用的な話題
欲張りマッチ
長野県.+市
という正規表現で”長野県佐久市”や”長野県軽井沢市”などにマッチさせたいとしましょう。このとき、「長野県飯田市佐藤市長」という文字を対象にしてマッチさせると、「長野県飯田市佐藤市」がマッチします。.+市は、「飯田市」で終わらず、「飯田市佐藤市」まで見つけてしまいます。これは、通常のマッチは、「見つかる限り一番長いマッチ」を見つけるという欲張りな特徴があるからです。
そこで、 長野県.+?市
のように+に?をつけると、「見つかる限り一番短いマッチ」を見るけるようになります。今回の場合「長野県飯田市」がマッチします。試してみましょう。
同じものの出現
“Hello World”や’Bye bye’のように、ダブルクオートかシングルクオートで囲まれた文字列にマッチさせようとして、 ["'].+?["']
という正規表現を作ったとします。これは一見正しそうに見えますが、実際には’Hello”のように、シングルクオートとダブルクオートの組み合わせでもマッチしてしまいます。こういう場合は、 ()
と \1
を用います。 ()
に囲まれた正規表現がマッチした内容が \1
に入るのです。
今回の場合は、 (["']).+?\1
のようにして、 ["']
を ()
で囲むことで、最初にマッチしたダブルクオートかシングルクオートが\1に入りますので、必ずダブルクオートかシングルクオート同士の組み合わせになります。このようなやりかたを 後方参照 と言います。
やってみよう
同じ数字でできた3桁の数を探す正規表現を作ってください。
解答例
([0-9])\1{2}
「ない」を表現する
「パーマン」にマッチさせたいとき、「スーパーマン」を除外する工夫として、 ^パーマン
という正規表現の書き方がありますが、これはパーマンが文中にあった場合に検出できないという問題があります。そこで、()と?を使った特殊な書き方を使います。
(?<!スー)パーマン
という正規表現を使うことで、前に「スー」がつかない「パーマン」だけを検索することができます。
正規表現 | 意味 | 例 |
---|---|---|
(?<!…) | 前に…がつかない | (?<!スー)パーマン (前に「スー」がつかない「パーマン」) |
(?!…) | 後ろに…がつかない | ハッカ(?!ー) (うしろに「ー」がつかない「ハッカ」) |