【1５分で出来るアレルギー克服】食わず嫌いの方のための正規表現体験

## はじめに
本記事は正規表現を**体験してみる**ことに重点を置いています。
細かい記述方法は良質な記事が豊富にありますので、割愛しています。

「正規表現ってなんか怖い！触りたくない・・・！」
と感じている、昨日までの自分のような方に贈ります。

結論：**触らないのはもったいない**です。

## この記事が役立つ方
- `/\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i`みたいな文字列を見たことがある
- でも、意味分かんないのでコピペでタスク回避していた
- 正規表現未経験者

## この記事のメリット
- 正規表現に対する抵抗がなくなる
- むしろもっと使ってみたくなる

## 正規表現とは
[Wikipedia](https://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE)によると、
「 文字列の集合を一つの文字列で表現する方法の一つ」

@jnchitoさんのこの記事によると、活用のポイントはここ。
> 正規表現を使うときは、最初に検索対象文字列の**「法則（パターン）」**をうまく見つけだすのが大切です。

## まずはRubularを開く
[Rubular](http://rubular.com/)という正規表現を試せる神サイトがあります。
まずは開きましょう。 
![スクリーンショット 2019-10-30 7.40.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/a5b82000-3537-49ae-7cc1-bc2d5566aac5.png)

検索例を用意しましたので、以下文書を**「Your test string」**にコピペしてください。

```
私の名前は田中太郎です。
住所は東京都××区△△町1-23-4です。
自宅番号は03-1234-5678
携帯番号は090-0000-1234です。

私の名前は山田花子です。
住所は大阪府××市△△町5-67-8です。
自宅番号は06-1234-5678
携帯番号は090-0012-3456です。

私の名前は鈴木はじめです。
住所は北海道〇〇市××町1の23です。
自宅番号は011の1234の5678です。
携帯番号は080の0001の2345です。
```
![スクリーンショット 2019-10-30 8.02.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/78f56927-3750-78bf-61ae-022327b2a43d.png)


ここから、**「Your regular expression」**に正規表現を打ち込んでみてアレルギーを克服します。

## 正規表現の明示方法
`/正規表現/`のように、`/`で区切って「ここが正規表現だよ」と明示します。

Rubularの**「Your regular expression」**に入力すると、自動的に`/`で囲ってくれた状態になるので入力不要です。
![スクリーンショット 2019-10-30 8.03.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/ff1120f4-3222-605e-55bf-39f81118cfd4.png)

## 【克服 1】数字を検索出来るようになる
まずは**「Your regular expression」**に
`\d\d-\d\d\d\d-\d\d\d\d`
と打ち込んでみてください。

「Match result」に検索結果がハイライトされます。
自宅番号が表示されました。
携帯番号や北海道の電話番号はうまく検索されていません。
![スクリーンショット 2019-10-30 8.04.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/6857d24e-f738-7728-12fc-a0140c21b1b3.png)

ここから、以下表を参照しながらいくつかパターンを試してみてください。
\dの個数を変えたり、間の`-`を抜いてみて変化をみます。

どうでしょう、「あ、そういうこと！」とアレルギーが治っていく感覚はありませんか？

| 正規表現 | マッチする対象 |
|:-:|:-:|
| \d | 半角数字１文字 |
| \d{3} | 半角数字３文字 |
| \d{2,3} | 半角数字2~3文字 |

**入力例**
`\d-\d\d-\d`
`\d{2}-\d\d\d\d-\d\d\d\d`
`\d{2}-\d{4}-\d{4}`
`\d{3}-\d{3}-\d{4}`
`\d{2,3}-\d{3,4}-\d{4}`

## 【克服 2】電話番号を自在に検索出来るようになる
さらに、以下知識で電話番号が自在に検索できます。

| 正規表現 | マッチする対象 |
|:-:|:-:|
| [ab] | aまたはb | 

**入力例**
`\d{2,3}[-の]\d{3,4}[-の]\d{4}`

楽しくなってきましたね。
![スクリーンショット 2019-10-30 8.05.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/fe887982-1e16-9c77-5d9b-d47885865441.png)


## 【克服 3】住所を検索出来るようになる
さらに、以下知識で住所も検索出来るようになります。

| 正規表現 | マッチする対象 |
|:-:|:-:|
| . | 任意の1文字 | 
| a+ |  aが１文字以上 |
| a* | aが0文字以上|

**入力例**
`..[都道府県].+[市区].+[町]`
![スクリーンショット 2019-10-30 8.06.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/b9f66b62-4e05-ef55-179d-3315db683a44.png)

## 【克服 4】番地を含んだ住所を検索出来るようになる

さらに、以下知識で番地を含む住所を検索出来るようになります。

| 正規表現 | マッチする対象 |
|:-:|:-:|
| (文字列) | 文字列をまとめる | 
| a? |  aか、もしくは何もないか |

**入力例**
`..[都道府県].+[市区].+[町]\d[-の]\d+([-の]\d)?`

これで**もう怖くない**ですね。
※この記事では**「Match groups」**については触れません。

あとは[Rubular](http://rubular.com/)下部にも記載方法がコンパクトにまとまっていますので、色々試すと楽しいです。
![スクリーンショット 2019-10-30 8.06.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/02ceb052-7228-9d7a-45b1-922ad98c73f8.png)


## 終わりに
本記事では、食わず嫌いだった自分への反省として記載しました。
皆様のアレルギー解消に活用して頂ければ幸いです。

また、@jnchitoさんの[この記事](https://qiita.com/jnchito/items/893c887fbf19e17d3ff9)によってアレルギー克服出来たことに感謝します。
文章もめちゃくちゃわかりやすく、読み手の立場に立っておりすごく尊敬しています。
伊藤さん、ありがとうございます！

## 参考にさせて頂いたサイト
[初心者歓迎！手と目で覚える正規表現入門・その１「さまざまな形式の電話番号を検索しよう」 - Qiita](https://qiita.com/jnchito/items/893c887fbf19e17d3ff9)
[正規表現 - Wikipedia](https://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE)
 [Rubular](http://rubular.com/)