100日後にエンジニアになるキミ - 46日目 - プログラミング - 正規表現について

昨日までのはこちら

[100日後にエンジニアになるキミ - 42日目 - クラウド - クラウドサービスについて](https://qiita.com/otupy/items/d1765f1541a104ed6133)

[100日後にエンジニアになるキミ - 36日目 - データベース - データベースについて](https://qiita.com/otupy/items/7af17635d576677606dc)

[100日後にエンジニアになるキミ - 24日目 - Python - Python言語の基礎1](https://qiita.com/otupy/items/6d1e5453f530e07b7aec)

[100日後にエンジニアになるキミ - 18日目 - Javascript - JavaScriptの基礎1](https://qiita.com/otupy/items/2f71d5f9c754b29d9555)

[100日後にエンジニアになるキミ - 14日目 - CSS - CSSの基礎1](https://qiita.com/otupy/items/61a97863f6df14171994)

[100日後にエンジニアになるキミ - 6日目 - HTML - HTMLの基礎1](https://qiita.com/otupy/items/cd2315dcb38671cfded0)


## 正規表現とは

ざっくり言うと`様々な文字列を一つの文字列で表現する表記法`です。

文字列には色々なパターンの文字列があります。
例えばメールアドレスだったり、電話番号はある一定の法則に従って文字列の体系ができています。

例：
電話番号：`090-1239-9283`
メールアドレス：`kyonudaisuki@otupydaisuki.com`

電話番号などは沢山の種類がありますが、これを１つの文字列としてまとめることができます。
それが正規表現となります。

正規表現は通常の文字 (a ～ z など) と`メタキャラクタ`という
特殊文字から構成される文字列のパターンになります。

## 何が便利なのか？

例えば手元のファイルのデータの中から`電話番号`を全て探すことを考えます。

電話番号は11桁の`0-9`までの数字で構成される番号体系です。
種類数で行くと10の11乗近くの番号が存在することになります。

これを全て手入力して検索する労力を考えると途方に暮れてしまいます。
電話番号のルールに従った文字列1つで検索できれば入力は1回で済みます。

正規表現のパターンを覚えるのは少し大変ですが
一度覚えてしまえば、どのプログラム言語でも用いることができるため
使い回しが効く便利な表現方法であるため、頭に入れておきましょう。

## 正規表現パターン

### 正規表現に用いられる基本文字

| 文字 | 説明 | 正規表現の例 | マッチする例 |
|:--:|:--|:--|:--|
| . | 任意の１文字 にマッチします。 | . | Ａ<br/>あ |
|  + | 直前の文字が １回以上 繰り返す場合にマッチします。<br/>最長一致。条件に合う最長の部分に一致します。 | otu+py | otupy<br/>otu...py |
| * | 直前の文字が ０回以上 繰り返す場合にマッチします。<br/>最長一致。条件に合う最長の部分に一致します。 | otu*py | otpy<br/>ot...py |
| ? | 直前の文字が ０個か１個 の場合にマッチします。<br/>最長一致。条件に合う最長の部分に一致します。 | otu?py | otpy<br/>otupy |
|  +? | 直前の文字が １回以上 繰り返す場合にマッチします。<br/>最短一致。条件に合う最短の部分に一致します。 | otu+?py | otupy<br/>otu...py |
| *? | 直前の文字が ０回以上 繰り返す場合にマッチします。<br/>最短一致。条件に合う最短の部分に一致します。 | otu*?py | otpy<br/>ot...py |
| ?? | 直前の文字が ０個か１個 の場合にマッチします。<br/>最短一致。条件に合う最短の部分に一致します。 | otu??py | otpy<br/>otupy |
| &#124;	 | いずれかの条件 (OR条件) として使われます。 | otu(py&#124;pi) | otupy<br/>otupi |
| &#92; | 直後の正規表現記号を エスケープ します。 | otu&#92;+py | otu+py |
| [...] | 角括弧に含まれるいずれか１文字にマッチします。 | [abc]<br/>[a-c] | a, b, c |
| [^...] | 角括弧に含まれる文字以外にマッチします。 | [^abc]<br/>[^a-c] | a, b, c<br/>以外の文字 |
| (...) | 文字を１つのグループにまとめることができます。 | otu(py&#124;pi) | otupy<br/>otupi |
| {n} | 直前の文字の桁数を指定できます。 | a{3} | aaa |
| {n,} | 直前の文字の最小桁数のみ指定できます。 | a{3,} | aaa<br/>aaaa... |
| {n,m} | 直前の文字の最小桁数と最大桁数を指定できます。<br/>最長一致。条件に合う最長の部分に一致します。 | a{3,4} | aaa<br/>aaaa |
| {n,m}? | 直前の文字の最小桁数と最大桁数を指定できます。<br/>最短一致。条件に合う最短の部分に一致します。 | a{3,4}? | aaa |

### 定義された正規表現

| 文字 | 説明 | 対応する表現 |
|:--:|:--|:--|
| \t | タブ | (なし) |
| \r | 改行。CR(Carriage Return：0x0D) | (なし) |
| \n | 改行。LF(Line Feed：0x0A) | (なし) |
| \d | すべての数字 | [0-9] |
| \D | すべての数字以外の文字 | [^0-9] |
| \s | 垂直タブ以外のすべての空白文字 | [&nbsp;\t\f\r\n] |
| \S | すべての非空白文字 | [^ \t\f\r\n] |
| \w | アルファベット、アンダーバー、数字 | [a-zA-Z_0-9] |
| \W | アルファベット、アンダーバー、数字以外の文字 | [^a-zA-Z_0-9] |

### 特定の位置関係を表す正規表現

| 文字 | 説明 | 正規表現の例 | マッチする例 |
|:--|:--|:--|:--|
| ^ | 直後の文字が行の 先頭 にある場合にマッチします。 | ^otupy | otupy... |
| $ | 直前の文字が行の 末尾 にある場合にマッチします。 | otupy$ | ...otupy |
| \< | 単語の先頭にマッチします。 | &#92;< | *otupy |
| \> | 単語の末尾にマッチします。 | &#92;> | otupy* |
| \b | 単語の先頭か末尾にマッチします。 | \b | &#42;otupy&#42; |
| \B | 単語の先頭か末尾以外にマッチします。 | \B | otupy |
| \A | ファイルの先頭にマッチします。 | \A | (なし) |
| \z | ファイルの末尾にマッチします。 | \z | (なし) |
| \G | 直前の一致文字列の末尾にマッチします。 | \G | (なし) |

## 正規表現の例

### よく使われる正規表現

```
Email アドレス
^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

URL
^https?://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$

ドメイン名
^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z-]{2,}$

固定電話番号
^0\d(-\d{4}|\d-\d{3}|\d\d-\d\d|\d{3}-\d)-\d{4}$

携帯電話番号
^0[789]0-\d{4}-\d{4}$

フリーダイヤル
^(0120|0800)-\d{3}-\d{3}$

日付 (YYYY-MM-DD)
^\d{4}-\d\d-\d\d$

郵便番号(XXX-XXXX)
^\d{3}-\d{4}$

都道府県
^.{2,3}[都道府県]$

クレジットカード
4[0-9]{12}(?:[0-9]{3})?
5[1-5][0-9]{14}
(?:2131|1800|35\d{3})\d{11}

IPアドレス
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}

半角英数字のみ
/^[0-9a-zA-Z]*$/

全角ひらがな
^[ぁ-んー]*$

全角カタカナ
^[ァ-ンヴー]*$

半角英数記号のみ
^[a-zA-Z0-9!-/:-@¥[-`{-~]*$
```

### 色々なパターン

```
a から始まって z で終わる 3 桁の文字列
a.z

a から始まって z で終わる 3 桁以上の文字列
a.+z

4 桁の半角数字
\d{4}

4 桁以上の半角数字
\d{4,}

n ～ m 桁の半角数字
\d{n,m}

桁区切りのカンマ付数字列
\b\d{1,3}(,\d{3})*\b

英単語
\b[\u\l]+\b
```


### 特殊文字

```
空白行
^\n

行全体
^.*$
```





## まとめ

正規表現は様々なパターンがありますが書かないと覚えられません。
一つ一つ試してみて、どう言う書き方ならヒットするかなどを
調べて書いて試して覚えましょう。


君がエンジニアになるまであと54日

## 作者の情報
乙pyのHP：
http://www.otupy.net/

Youtube：
https://www.youtube.com/channel/UCaT7xpeq8n1G_HcJKKSOXMw

Twitter：
https://twitter.com/otupython