正規表現初学者が正規表現について学んだことをアウトプットしてみた


# はじめに
正規表現について、初学者が自分なりにまとめたことをアウトプットします。
正規表現とは何か、正規表現の記法、注意点、使用例の順で解説します。
初学者向けの取っ掛かりになればと思います。

# 正規表現とは
正規表現とは、特定のパターンの文字列を表現する記法です。
「Aで始まりNで終わる英字6文字の文字列」「数値で始まり英字で終わる行」等特定のパターンの文字列を柔軟に表現する記法です。
正規表現を覚えることで、文字列検索・抽出・置換等文字列操作を素早く行え、作業効率upを見込めます。

# 正規表現の記法
正規表現の記法について解説します。

### 基本的な正規表現
基本的な正規表現について解説します。
使用例と、マッチする文字列の例も解説します。

|文字|意味|正規表現の例|マッチする例|
|:----:|:----:|:----:|:----:|
|.|改行を除く任意の1文字|AB.C|ABDC, ABEC等|
|*|直前の文字の0文字以上の繰り返し|AB*C|AC, ABBBC等|
|+|直前の文字の1文字以上の繰り返し|AB+C|ABC, ABBBBBC等|
|?|直前の文字が0個or1個|AB?C|AC, ABC||


上記文字を組み合わせたパターンについて解説します。

|文字|意味|正規表現の例|マッチする例|
|:----:|:----:|:----:|:----:|
|.*|任意の0文字以上|AB.*C|ABC, ABDEFGHIC等|
|.+|任意の1文字以上|AB.+C|ABDC, ABDEFGHIC等|
|*?|直前の文字を0回以上繰り返す|AB*?C|AC, ABDEDEDEC等|
|+?|直前の文字を1回以上繰り返す|AB+?C|ABC, ABDEDEDEC等|
|??|直前の文字を0回or1回繰り返す|AB??C|AC, ABC|

### グルーピング
グルーピングについて解説します。
使用例と、マッチする文字列の例も解説します。

| 文字   | 意味                                           | 正規表現の例 | マッチする例           | 
|:----:|:----:|:----:|:----:|
|｜     |                        OR条件       | ABC｜ADC | ABC, ADC | 
| [ ]    | [ ]内に含まれるいずれか1文字にマッチ           | AB[DEF]C     | ABDC, ABEC, ABFC       | 
| [^ ]   | [ ]内に含まれる文字以外にマッチ                | AB[^DEF]C    | ABBC, ABGC等           | 
| ( )    | 文字を1つのグループにまとめる                  | AB(DE｜FG)C                   | ABDEC, ABFGC | 
| {n}    | 直前の文字の桁数を指定                         | AB{3}C       | ABBBC                  | 
| {n,}   | 直前の文字の最小桁数を指定                     | AB{3,}C      | ABBBC, ABBBBBBC等      | 
| {n,m}  | 直前の文字の最小桁数と最大桁数を指定(最長一致) | AB{3,5}C     | ABBBC, ABBBBC, ABBBBBC | 
| {n,m}? | 直前の文字の最小桁数と最大桁数を指定(最短一致) | AB{3,5}?C    | ABBBC, ABBBBC, ABBBBBC | 
※｜は半角です。

### 特定の位置関係
特定の位置関係について解説します。
使用例と、マッチする文字列の例も解説します。

| 文字 | 意味                       | 正規表現の例 | マッチする例       | 
|:----:|:----:|:----:|:----:|
| ^    | 文字列の先頭を表す         | ^ABC         | ABC, ABCDEFG..等   | 
| $    | 文字列の末尾を表す         | ABC$         | ABC, ..xyzABC等    | 
| \b   | 単語の先頭or末尾           | \bABC        | ABC, ABCDEF等      | 
|      |                            | ABC\b        | ABC, XYZABC等      | 
| \B   | 単語の先頭でも末尾でもない | \BABC        | ZABCD, XYZABCDEF等 | 
|      |                            | ABC\B        | ZABCD, XYZABCDEF等 | 
 
### 定義済みの正規表現
定義済みの正規表現について解説します。
別表現があれば、それも解説します。

| 文字 | 意味                                   | 言い換え       | 
|:----:|:----:|:----:|:----:|
| \t   | 水平タブ                               | -              | 
| \v   | 垂直タブ                               | -              | 
| \f   | フォームフィード(改ページ)             | -              | 
| \r   | 改行(CR)                               | -              | 
| \n   | 改行(LF)                               | -              | 
| \a   | ベル                                   | -              | 
| \s   | 空白文字(※垂直タブ除く)               | [ \t\f\r\n]    | 
| \S   | 空白文字以外                           | [＾ \t\f\r\n]  | 
| \l   | 半角英小文字                           | [a-z]          | 
| \L   | 半角英小文字以外                       | [＾a-z]        | 
| \u   | 半角英大文字                           | [A-Z]          | 
| \U   | 半角英大文字以外                       | [＾A-Z]        | 
| \d   | 数値                                   | [0-9]          | 
| \D   | 数値以外                               | [＾0-9]        | 
| \w   | アルファベット、アンダーバー、数値     | [a-zA-Z_0-9]   | 
| \W   | アルファベット、アンダーバー、数値以外 | [＾a-zA-Z_0-9] | 

# 注意点
正規表現を扱ううえでどつぼに嵌まりやすいポイントを3点解説します。　

- 特定の文字を扱う際、\でエスケープする必要がある
例えば、+を「1回以上の繰り返し」という意味ではなく「+という文字」として扱いたい場合、ただ「+」と入力するだけでは前者で解釈されてしまいます。
後者で使用したい場合、\\+と入力する必要があります。
\を使用して、前者で解釈されることを防ぐ必要があります(エスケープと言います)。

- 行頭行末は忘れがち
行頭を表す「^」や行末を表す「$」の条件指定をついつい忘れがちです。

- ツールによっては使えない正規表現がある
例えば、?はperl(※プログラミング言語のひとつ)では使えますが、sed(※linuxで文字列置換等ができるコマンド)では使えません。
意図した結果にならない可能性があるので、注意が必要です。

# 例
　正規表現を使用した例と、記法の意味について解説します。

- 郵便番号	

```
	\d{3}-\d{4}
```
	
(3ケタの数値) - (4ケタの数値) という意味です。
	
- 携帯電話番号

```
	0[789]0-\d{4}-\d{4}
```
0(7 or 8 or 9)0 - (4ケタの数値) - (4ケタの数値) という意味です。
	
- 固定電話番号

```
	0\d(-\d{4}|\d-\d{3}|\d{2}-\d{2}|\d{3}-\d|)\d{4}
```

以下のいずれかのパターンを指します。

 ・ 0△-□□□□-××××
 ・ 0△△-□□□-××××
 ・ 0△△△-□□-××××
 ・ 0△△△△-□-××××
 
末尾は4ケタの数値固定です。
	
- メールアドレス

```
	\w+([\-\+\.]\w+)*@\w+([\-\.]\w+)*.\w+([\-\+\.]\w+)*
```
	
\w+　　   　  ：アルファベット、アンダーバー、数値の1回以上の繰り返し..(※1)
[\\-\\+\\.]　　   ：-か+か.のいずれか..(※2)
([\\-\\+\\.]\w+)*：(※1)または(※2)の0回以上の繰り返し
	
- URL

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

?      　　　　　　：直前の文字が0個or1個
[\w\\-]+ 　　　 ： [アルファベット、アンダーバー、数値、ハイフン]の1回以上の繰り返し..(※3)
\.　　　 　　　：「.」という文字..(※4)
([\w\-]+\.)+　　 ：(※3)または(※4)の1回以上の繰り返し
[\w\\-\\./\?%&=]\*：[アルファベット、アンダーバー、数値、ハイフン、ドット、スラッシュ、?、%、&、=]の1回以上の繰り返し..(※5)
(/[\w\-\./\?%&=]*)?：/ または(※5)が0個or1個


# おわりに
　正規表現について解説しました。
　著者は正規表現に対して苦手意識を持っていました。
　よく分からない記号がずらずら並んでいて、何を言っているかサッパリでした。
　ただ、知識を習得すれば応用が利きやすいと思います。
　くわえて、知識習得のハードルはそれほど高くないと思います。
　便利なのでぜひ覚えてみてください。

# 参考元
　記事作成にあたり、以下のサイトを参考にしました。
　・https://murashun.jp/article/programming/regular-expression.html
　・https://www.tohoho-web.com/ex/regexp.html
　・https://www.ne.jp/asahi/futohen/sankaku/h085.htm
　・https://www.megasoft.co.jp/mifes/seiki/s310.html