ゼロから始める正規表現 ~初心者から抜け出す珠玉の７問~

## はじめに
正規表現というと、とっつきにくいイメージがあるかなと思います。
しかし、一度身につけてしまえば色々な文字列に関する作業を効率化できるようになります。
今努力して正規表現を身につけて将来の効率化を目指すか、頑張らないで非効率なまま過ごしていくか。

今回は、正規表現初心者のために７つの問題を解くことによって、脱初心者になるための記事です。

記事の最後には、正規表現はや見表をつけています。


## 正規表現とは
正規表現とは簡単に言うと、いくつかの文字列を一つの形式で表現するための表現方法です。

では、どんなものに使えるのでしょうか？
よく使われる例として、電話番号があります。

~~~bash:text
郵便番号：123-4567
電話：03-1234-5678
内線：555
~~~

というようなテキストがあった時に、電話番号だけを抜き出したいとします。
この程度なら頑張ればプログラムを書くこともできますが、苦労しますよね。

正規表現を使った場合、

~~~bash:re
\d\d-\d\d\d\d-\d\d\d\d
~~~

これだけで、パターンマッチすることができます。

どうでしょう。効率的ですよね？

これから、"\d"などの解説をしていきます。

## 一文字にマッチング
一文字にマッチングする代表的なものを以下に並べます。

| 記号　| 意味  |
|:-----:|:----------:|
|\d|0~9の数字|
|\D|数字以外の文字|
|\s|空白文字・タブ・改行|
|\S|空白文字・タブ・改行 以外の文字|
|\w|アルファベット・数字・アンダースコア|
|\W|アルファベット・数字・アンダースコア　以外|


~~~bash:text
郵便番号：123-4567
電話：03-1234-5678
内線：555
~~~

#### 問題１
textの中から、四つの文字からなる単語にマッチする正規表現を書け。

~~~bash:問題の答え
次の問題の下に、前の問題の答えが書いてあります。
~~~

## メタ文字

|  記号　| 意味  |
|:----:|:----:|
|.|任意の一文字|
|[]|[]内のいずれかの文字|
|?|0回か1回の繰り返し|
|+|1回以上の繰り返し|
|*|0回以上の繰り返し|
|{m,n}|最小m回で最大n回|
|^|文字列の先頭|
|$|文字列の末尾|

### 任意の一文字にマッチ
任意の一文字を表すのは「.」（ピリオド）

~~~bash:example
正規表現：a.
例文：abcde
マッチする文字：ab
~~~

#### 問題２
上記の例文で正規表現を「c.」とすると、マッチする文字は何か？

~~~bash:問題１の答え
\D\D\D\D
~~~

### どれか一文字にマッチ
どれか一文字にマッチさせるには「[]」で囲む。

~~~bash:example
正規表現：[Tt]his
マッチする文字：This or this
~~~

例えば、abc bbc cbc・・・というような文字列をマッチしたい時、
[abcdefghijklm・・・]bc
という様に打つのは面倒くさいですよね。
その代わりに、[a-z]と打てば、小文字アルファベットに対応できます。
さらに、アルファベットすべてに対応したかったら、[A-z]と書けばOKです。


#### 問題３
a-0 or b-1 or c-2 or d-3 ・・・　z-25
のいずれの文字が文章中に出現する。
これらにマッチする正規表現を書け。

~~~bash:問題２の答え
cd
~~~


### 1回以上の繰り返しと、0回以上の繰り返し
1回以上の繰り返しは「+」、0回以上の繰り返しは「*」で表します。

~~~bash:example
正規表現：.*
意味：任意の文字が０回以上続く
マッチする文字：空文字、a、aa、0123
~~~

~~~bash:example
正規表現：[0-9A-z]+ 
意味：半角英数字が１文字以上続く
マッチする文字：a、aaa、0c1c2c3
~~~

### メタ文字へのマッチ
メタ文字へマッチさせるには、「\メタ文字」とします。

~~~bash:example
正規表現：\.
マッチする文字：.
~~~

### パターンが連続する回数を指定する
|  記号　| 意味  |
|:----:|:----:|
|{n} | 直前のパターンがn回続く|
|{n,} | 直前のパターンがn回以上続く|
|{n,m} | 直前のパターンがn回以上m回以下続く|

~~~bash:text
郵便番号：123-4567
電話：03-1234-5678
内線：555
~~~

#### 問題４
textの中から、郵便番号にマッチする正規表現を書け。

~~~bash:問題３の答え
[a-z]-\d{1,2}
~~~

### 0回か1回の繰り返し
0回か1回の繰り返しは「?」で表します。
例えば、appleかapplesをマッチしたい時は、apples?とすると、直前の文字の0回か1回の繰り返しとなり、apple or applesに対応します。

#### 問題５
httpかhttpsで始まるURLにマッチする正規表現を書け。

~~~bash:問題４の答え
\d{3}-\d{4}
~~~



### 行の先頭か最後とマッチ
行の先頭は「^」、行の最後は「$」です。

### 複数パターンへのマッチ
複数パターンのいずれかにマッチしたい時は、「|」で区切る。
プログラミングでいうorと一緒。

(this|that)　これで、this or thatにマッチする。


#### 問題６

~~~bash:text
This is a pen.
this is a pen.
That is a pen.
that is a pen.
~~~

上記の文章のいずれかの文が与えられた時に、文頭のThis,this,That,thatにきちんとマッチする正規表現を書け。

~~~bash:問題５の答え
https?//[0-9A-z\.]+
~~~

### []内で否定したい時
~~~bash:example
正規表現：ABC[^a-z]
意味：ABCとa~z以外のすべての文字
マッチする文字：ABCD, ABCZ
~~~


#### 問題７　応用問題
メールアドレスにマッチする正規表現を書け。


~~~bash:問題６の答え
([Tt]his|[Tt]hat)
~~~




## 正規表現 はや見表

### １文字にマッチングする特殊文字

| 記号　| 意味  |
|:-----:|:----------:|
|\d|0~9の数字|
|\D|数字以外の文字|
|\s|空白文字・タブ・改行|
|\S|空白文字以外の文字|
|\w|アルファベット・数字・アンダースコア|
|\W|アルファベット・数字・アンダースコア　以外|
|\t|たぶ|
|\r|リターン|
|\n|改行|
|\○○○|8進数の○○○で表される文字|
|\x○○|16進数の○○で表される文字|

### メタ文字

|  記号　| 意味  |
|:----:|:----:|
|?|0回か1回の繰り返し|
|+|1回以上の繰り返し|
|*|0回以上の繰り返し|
|{m,n}|最小m回で最大n回|
|^|文字列の先頭|
|$|文字列の末尾|
|.|任意の一文字|
|[]|[]内のいずれかの文字|


※　自分も初心者なので、間違え等ありましたらご連絡お願い致します。

~~~bash:問題７の答え
[\w.\-]+@[\w\-]+\.[\w.\-]+
~~~