Rubyの正規表現のアウトプット①

# 参考記事と書籍
https://qiita.com/jnchito/items/893c887fbf19e17d3ff9

https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AERuby%E5%85%A5%E9%96%80-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%BB%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%8A%80%E6%B3%95%E3%81%BE%E3%81%A7-Software-Design-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4774193976

# この記事の概要
この記事は上の記事のアウトプットのための記事です。
よりわかりやすい説明は上の記事を読んでください。


# 正規表現とは
文字列をわかりやすく置き換える手法です。

# 正規表現を書いてみた
まずこんなをテキストを以下のサイトのYour test string;にコピペしました。
⚫︎Rubular
http://rubular.com/ 

```
名前：伊藤淳一
電話：03-1234-5678
住所：兵庫県西脇市板波町1-2-3
```
Match resultに表示されました。
そしてYour regular expressionに```\d```を入力しました。
そうするとMatch resultの数字が水色に点滅しました。


 ```\d``` は正規表現では```「メタ文字」```という特別な意味があるみたいです。
```\d``` は「1個の半角数字（0123456789）」を表すメタ文字で（文字の集合を表しているので、
特に ***「文字クラス」*** と呼ばれているみたいです）。


# メタ文字を使って文字列検索
```\d\d-\d\d\d\d-\d\d\d\d```をYour regular expressionに入力しました。
これで電話番号が水色に点滅し、***電話番号がはっきりとわかるように***なりました。

```\d は1個の半角数字```で```\d\dは２個の半角数字```です。
```"\"```は文字列として扱われます。
```-```はメタ文字ではなく```"-" という文字```みたいです。
使い方によっては ```-``` も特殊な意味を持つみたいです。
電話番号の03-1234-5678を当てはめてみました。
```\d\d-\d\d\d\d-\d\d\d\d```は
***半角数字２個、ハイフン、半角数字4個、ハイフン、半角数字4個***で合致して
電話番号がきれいに水色に点滅しました。

***これを自分に当てはめて***みました。
住所や電話番号は変えておきます。

```
名前：Hashimoto Noriaki
電話：060-2893-4789
住所：埼玉県XX市YY町5番
```
この中の番号を検索しました。そして以下の記述をしました。
```\d\d\d-\d\d\d\d-\d\d\d\d```
で060-2893-4789が水色に点滅しました。

# MacOSでのバックスラッシュの入力方法
```option + ¥```で```\```を入力できます。
しかし毎回\の入力の際、optionを使うのが面倒な場合は
打つ必要がなくなる設定ができるみたいです。
https://qiita.com/miyohide/items/6cb8967282d4b2db0f61

# Rubyで動かしてみた
正規表現はプログラミング言語やテキストエディタ内でも使用できるみたいです。
実際に動かしてみます。

⚫︎環境
***VSCode***

```/ /``` で囲まれた部分が正規表現（Regexpクラスのインスタンス）です。

```rb
text = <<TEXT
名前：Hashimoto Noriaki
電話：0290-69-1259
住所：埼玉県さいたま市XX345
TEXT
puts text.scan /\d\d\d\d-\d\d-\d\d\d\d/
```
実行し

```rb
0290-69-1259
```
と出力されました。

```rb
note = <<NOTE
名前：Hashimoto Noriaki
電話：060-1655-8177
住所：東京都新宿区西新宿356
NOTE
puts note.scan /\d\d\d-\d\d\d\d-\d\d\d\d/
```

```
060-1655-8177
```
と出力。


# JavaScriptでも動く
***JavaScriptでも正規表現は使える***みたいです。

JS向けにScriptularというRubyの時とほぼ同じサイトがあるみたいです。
JS上の正規表現の動作を確認したい場合は下のサイトがいいみたいです。
https://scriptular.com/

⚫︎補足
devtoolsをすぐ開けるコマンド(Mac)
```command``` + ```option``` + ```i```

Rubyの時と同じ処理を書いてみました。

```js
var text =
  '名前:Hashimoto Noriaki\n 電話:0290-69-1259\n 住所:埼玉県さいたま市XX345';
console.log(text.match(/\d\d\d\d-\d\d-\d\d\d\d/g));
```
実行すると

```js
['0290-69-1259']
```
⚫︎補足
```/\d\d\d\d-\d\d-\d\d\d\d/g```のgは
グローバルオプションと呼ばれるもので、下のような違いがあるみたいです。

・```gなし``` => ***最初の1件が見つかったら検索終了***
・```gあり``` => 一致する文字列をすべて抽出

# いろんな市外局番への対応
携帯だけでなく地域によって番号が変わるのでいろんな番号への対応をみていきます。

```
名前：Hashimoto Noriaki
電話：02-1234-3456
電話：090-1244-5647
電話：0395-19-1359
電話：02992-1-2345
住所：埼玉県XX市YY町456
```
こちらをRubularに貼り付けてみました。
先程の ```/\d\d\d\d-\d\d-\d\d\d\d/```では検索ができません。
***法則を見つけることが大事***みたいです。
```半角数字が2個～5個、ハイフン、半角数字が1個～4個、ハイフン、半角数字が4個```
みたいな感じです。

これを正規表現で書いていきます。

⚫︎文字の個数の限定法
```{n,m}``` 　```{m}```などの```メタ文字```を使うみたいです。
このnとmを数字に置き換えていきます。
```{1,5}```なら```１個以上5個以下```という意味です。
```{３}ならちょうど3```という意味です。

```
\d{2,5}-\d{1,4}-\d{4}
```
これなら```２個以上5個以下、ハイフン、1個以上4個以下、ハイフン、4個```という意味でこれで
電話番号を検索できます。

# カッコの対応
下のようにカッコがつくと上のやり方で検索できなくなります。

```
名前：Hashimoto Noriaki
電話：02-(1234)-3456
電話：090-(1244)-5647
電話：0395-(19)-1359
電話：02992-(1)-2345
住所：埼玉県XX市YY町456
```

```
\d{2,5}-\d{1,4}-\d{4}
```
だと検索できません。
今回```「ハイフンまたはカッコ（開き）」と、「ハイフンまたはカッコ（閉じ）」という「AまたはB」のパターン```
があります。

***「AまたはBの1文字」表す***場合は ```[AB]``` と書くみたいです。（文字クラス の一種です）。
```[ ]の中の文字数に制限はなく[ABC]と書けば、「AまたはBまたはCの1文字」```となるみたいです。

ハイフンまたはカッコ（開き）と、ハイフンまたはカッコ（閉じ）はそれぞれ、
```[-(]、[-)]``` と表現するみたいです。


```
名前：Hashimoto Noriaki
電話：02(1234)3456
電話：090-1244-5647
電話：0395(19)1359
電話：02992-1-2345
住所：埼玉県XX市YY町456
```

```
\d{2,5}[-(]\d{1,4}[-)]\d{4}
```
で電話番号は全部検索できます。

# カッコハイフンについて
[a-z] などの***カッコハイフン***となると文字の範囲を表すみたいです。
[-az] や [az-] のように、ハイフンが [ ] の最初または、最後に置かれると「ハイフン1文字」の意味になるみたいです。
```[0-9]```とすると

```
名前：Hashimoto Noriaki
電話：02(1234)3456
電話：090-1244-5647
電話：0395(19)1359
電話：02992-1-2345
住所：埼玉県XX市YY町456
```
の***数字の0から9まで検索***されます。半角数字が検索されます。\d と同じです。
```[-15]```だと***ハイフン、１と５が検索されます。***

# ポイント
かなり難しい内容ですが最後に知っておくべきことです。

```\d``` は```半角数字1文字```
```{n,m}``` は```直前の文字が n 文字以上、m 文字以下```
```{n}``` は```直前の文字がちょうど n 文字```であることを表す
```[AB] は```AまたはBが1文字```であることを表す
```[a-z]```は```aからzの範囲を表す```
```[-az]```は```ハイフン、aとzを表す```