正規表現とは
沢山ある文章の中から、簡単に目的の文字列を検索できる表現のことです。
文字や文字列を指定して、一致する文字列を検索したり、置換したりすることができます。
メタ文字の種類
正規表現にはメタ文字を使用します。
メタ文字は半角で表記します。
正規表現チェッカーを使用して、確認することができます!
「.」→一文字
1文字入っているものを抽出するものです。
文字は何でもOK!(漢字でもアルファベットでも数字でも)
これ以降も、ドットの数だけ、文字を抽出できます。
例)
私は人です。
私は犬です。
私は鳥です。
私は狼です。
私は熊です。
私はです。
私はネコです。
私はdogです。
①上記から「私は〇です。」を抽出
②上記から「私は〇〇です。」を抽出
「 [] 」→この中に入ってる各1文字
この中に入る一文字を抽出します。
例)
私は人です。
私は犬です。
私は鳥です。
私は狼です。
私は熊です。
私はです。
私はネコです。
私はdogです。
上記から、「私は犬です。」「私は熊です。」を抽出
組み合わせて使うこともできる
例)
下記から、携帯番号を抽出
090-3344-4455
03-8764-3344
080-4444-5555
080-6655-7421
080-6655-7421
3080-6655-7421
080-6655-74215
08099871111
0438-33-4455
06-4568-6677
0438765437667
043あ7654あ7667
ここで、携帯番号だと、だいたい3桁ー4桁ー4桁になると思うので、
[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]
と入力しましたが、
これでは、
3080-6655-7421
080-6655-74215
が入ってしまいます。
その時に使えるのが、「 ^ 」「 $ 」です!
(下記に続きます。)
「 ^ 」「 $ 」→○○から始まる/文末が○○
「 ^ 」は、頭が○○から始まる文字列を表します。
「 $ 」は、文末が○○で終わる文字列を表します。
例 ①)
上の例を参考に、下記から、携帯番号を抽出
090-3344-4455
03-8764-3344
080-4444-5555
080-6655-7421
080-6655-7421
3080-6655-7421
080-6655-74215
08099871111
0438-33-4455
06-4568-6677
0438765437667
043あ7654あ7667
先程抽出されてしまった、
3080-6655-7421
080-6655-74215
が除かれていることがわかります。
例 ②)
私は人です。
私は犬です。
私は鳥です。
私は狼です。
私は熊です。
私はです。
私はネコです。
私はdogです。
あなたは犬、私は人間です。
上記から、「私は○○です。」から始まる文字列を抽出
「^私は..です。」は、「私は..です。」から始まる文字列を表しています。
「私は人間です。」 は、文字が二つなので、「私は..です。」で抽出できますが、
先頭が、「あなたは犬~」から始まるため、「^私は..です。」には当てはまりません。
「 {} 」「{},」→繰り返す
直前のパターンを「{〇}」〇回繰り返すというものです。
「{〇,}」は、〇回以上繰り返すという意味です。
例 )
下記から、携帯番号を抽出
090-3344-4455
03-8764-3344
080-4444-5555
080-6655-7421
080-6655-7421
3080-6655-7421
080-6655-74215
08099871111
0438-33-4455
06-4568-6677
0438765437667
043あ7654あ7667
上述した例でいうと
^[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$
ですが、何度も繰り返してわかりにくいので、
^[0-9]{3}-[0-9]{4}-[0-9]{4}$
このように表すことができます。
「 | 」「 () 」→複数指定できる
「 | 」は、〇か〇 ように 複数の文字列を抽出できます。
「 () 」は、グループ化することができます。
例 ①)
私は人です。
私は犬です。
私は鳥です。
私は狼です。
私は熊です。
私はです。
私はネコです。
私はdogです。
あなたは犬、私は人間です。
上記から、「犬」「ネコ」「dog」を抽出
上記から、「私は人です。」「私は犬です。」「私は人間です。」という文章だけ抽出
あなたは犬から始まる文も出てきてしまったので、
^私は(人|犬|人間)です。$
と表現しました。
例 ②)
下記から、携帯番号(090か080から始まるもの)を抽出
090-3344-4455
070-5556-5566
03-8764-3344
080-4444-5555
080-6655-7421
080-6655-7421
3080-6655-7421
080-6655-74215
08099871111
0438-33-4455
06-4568-6677
0438765437667
043あ7654あ7667
070から始まる電話番号は選択されていないようになります。
「 ? 」→前の文字あってもなくてもOK
前の文字が0個か1個(あってもなくてもOK)という意味になります。
例 )
下記から、携帯番号を抽出
090-3344-4455
070-5556-5566
03-8764-3344
080-4444-5555
080-6655-7421
080-6655-7421
3080-6655-7421
080-6655-74215
08099871111
0438-33-4455
06-4568-6677
0438765437667
043あ7654あ7667
アンケートなど、080-0000-0000とハイフンをつけている人と、連続して書く人がいるときがあります。
そんな時に、ハイフンの前に「?」をつけると、両方認識することができるのです。
^[0-9]{3}-?[0-9]{4}-?[0-9]{4}$
(ハイフンあってもなくてもいいよ~という意味)
「+」→前の文字を1文字以上繰り返す
直前のパターンを1文字以上繰り返すものを抽出します。
例)
下記から、人〇があるものを抽出
私は人
人間
人参
人面犬
人の顔をした猫です
私は人です
犬です
「私は人」は、人がつきますが、人の後には何もないため抽出されません。
人からはじまる人○○なら、単語ではなくても、「人の顔をした猫」も当てはまります。
同様に
「私は人.+です」の場合も、「.」は1文字を表しているため、「人」の後に1文字以上のものが付く場合しか抽出されなくなります。
「 * 」→前の文字を0回以上繰り返す
直前のパターンを0文字以上繰り返すものを抽出します。
例)
私は人
人の顔をした猫です
私は人です
私は人間です
犬です
前回の例を使用すると、「私は人.+です」の場合は、「私は人間です」しか抽出されませんでしたが
人の後の文字は0文字以上繰り返すので、「私は人です」も抽出されます。
「^」→否定
「^」は、先頭を表すものでしたが、「 [] 」の中で使用すると否定の意味となります。
繰り返すもののまとめ「 ? 」「+」「 * 」「 {〇} 」
メタ文字 | 直前のパターン繰り返す回数 |
「 ? 」 | 0 回 か 1 回 |
「+」 | 1回 以上 |
「 * 」 | 0回 以上 |
「 {〇} 」 | 直前のパターンを〇回繰り返す |
「 {〇,} 」 | 直前のパターンを〇回以上繰り返す |
「 {〇,△} 」 | 直前のパターンを〇回以上△回以下繰り返す |
\のいろいろ
\ | 抽出するもの |
\d | 1文字以上の数字 [0-9]と一緒 |
\D | 数字以外の1つの文字 |
\w | 単語文字(アルファベット、数字、アンダースコア(_))のいずれか |
\W | 単語文字以外の1つの文字 |
\s | 空白文字(スペース、tab、改行)のいずれか |
\S | 空白文字以外の1つの文字 |
\b | 単語の境界 \bapple\b → 「apple」という単語にマッチ |
\B | 単語の境界以外の位置 |
復習
郵便番号を抽出したいときは、
〒292-3344
〒176-0023
3232-3344
〒123-4455
292-4567
〒898-9988
2920083
〒2920083
090-4564-4574
○○○ー○○○○を抽出したいので
^〒?[0-9]{3}-?[0-9]{4}$
初心者でも、これからプログラムを書いていくようになる時に知っておくと楽なそうです。
コメント