使いこなそう正規表現(入門)

この記事は株式会社クロノスの「[~2020年春~勝手にやりますアドベントカレンダー](https://qiita.com/beeeyan/items/342d51fa301bcf81e9c0)」の18日目の記事です！

## はじめに
正規表現の基本知識をまとめました。  
正規表現は、ファイル検索や文字列置換を行うときに使用することができます。  
エディタの検索で正規表現を活用することで、検索効率や置換効率があがるので活用していきましょう。
VSCodeでは以下の「.*」を選択すると正規表現が使用できるようなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251104/f605d7f9-8b6e-714c-8e61-4bd537598f28.png)


サンプルコードはJavaScriptの `match` メソッドを使用しています。

```JavaScript
'対象文字列'.match(/正規表現/);
// 取得結果
```

# メタ文字(使用頻度が高いもののみ)
## `. `
任意の１文字 にマッチします。  

【例】

```JavaScript
'test'.match(/./)[0];
// "t"
```

## `+`
直前の文字が **1**回以上 繰り返す場合にマッチします。  

【例】

```JavaScript
'tttee'.match(/t+/)[0];
// "ttt"
'tttee'.match(/a+/)[0];
// エラー( Cannot read property '0' of null )
```

## `*`
直前の文字が **0**回以上 繰り返す場合にマッチします。  

【例】

```JavaScript
'tttee'.match(/t*/)[0];
// "ttt"
'tttee'.match(/a*/)[0];
// ""
```

## `[]`
角括弧に含まれるいずれかの**1**文字にマッチします。  
角括弧内で「-」を用いることで範囲指定をすることもできます。  

【例】

```JavaScript
'test'.match(/[abcde]/)[0];
// "e"
'test'.match(/[a-e]/)[0];
// "e"
'13579'.match(/[2-4]/)[0];
// "3"
'090-0000-1111'.match(/0[789]0/)[0];
// "090"
```

## `?`
「?」には大きく、以下の2つの役割があります。
1. 直前の文字は省略可能
1. 最短マッチにする。  

【例】

1. 直前の文字は省略可能。

```JavaScript
'https'.match(/https?/)[0];
// "https"
'http'.match(/https?/)[0];
// "http"
```

2. 最短マッチにする。

```JavaScript
'test'.match(/.*t/)[0];
// "test" (*は最長マッチ)
'test'.match(/.*?t/)[0];
// "t" (*は最長マッチを最短マッチに変更する)
```

## `|`
いずれかの条件 (OR条件)として使用可能。  

【例】

```JavaScript
'test'.match(/s|e/)[0];
// "e"
'sample'.match(/a|p|e/)[0];
// "a"
```

## `()`
文字を1つのグループとして、まとめることができる。  

【例】

```JavaScript
'test'.match(/(et)|(te)/)[0];
// "te"
'oioioioiooi'.match(/(oi)+/)[0];
// "oioioioi"
'test_dayo'.match(/test_(dayo)?/)[0];
// "test_dayo"
```

## `\ `
直後の正規表現記号をエスケープする。  

【例】

```JavaScript
'test.com'.match(/\.com/)[0];
// ".com"
'test(.com)'.match(/\(\.com\)/)[0];
// "(.com)"
```

## `^`
1. 行の始まりにマッチする。
1. **[]** 内で使用した場合、否定の意味になる。  

【例】

1. 行の始まりにマッチする。

```JavaScript
'http://www.test.com'.match(/^http/)[0];
// "http"
'http://www.test.com'.match(/^www/)[0];
// エラー ( Cannot read property '0' of null )
```

2. **[]** 内で使用した場合、否定の意味になる。

```JavaScript
'123456789'.match(/[^0-8]/)[0];
// "9"
'http://www.test.com'.match(/[^w]+/)[0];
// "http://"
```

## `$ `
行の終わりにマッチする。  

【例】

```JavaScript
'http://www.test.com'.match(/com$/)[0];
// "com"
'http://www.test.com'.match(/com|jp)$/)[0];
// "com"
```


## `{}`
1. 直前の文字の桁数を指定可能。
1. **{n,}** で桁数n以上の指定が可能
1. **{n,m}** で桁数n以上m以下の指定が可能  

【例】

```JavaScript
'http://www.test.com'.match(/w{3}/)[0];
// "www"
'http://www.test.com'.match(/w{2,}/)[0];
// "www"
'http://www.test.com'.match(/w{2,4}/)[0];
// "www"
```


## `(?<=)`
直前に特定の文字がある場合にマッチする。(肯定先読み)  

【例】

```JavaScript
'http://www.test.com'.match(/(?<=www).+/)[0];
// ".test.com"
```

## `(?=)`
直後に特定の文字がある場合にマッチする。(肯定後読み)  

【例】

```JavaScript
'http://www.test.com'.match(/.+(?=com)/)[0];
// "http://www.test."
'http://www.test.com'.match(/(?<=www\.).+(?=\.com)/)[0];
// "test"
```

# エスケープシーケンスを使ったメタ文字(使用頻度が高いもののみ)

## `\d`
すべての数字。`[0-9]` と同等の意味。
## `\D`
すべての数字以外。`[^0-9]` と同等の意味。
## `\t`
タブ。
## `\n`
改行。LF(Line Feed：0x0A)
## `\s`
垂直タブ以外のすべての空白文字。`[\t\f\r\n]`と同等の意味。
## `\S`
垂直タブ以外のすべての空白文字以外。`[^\t\f\r\n]`と同等の意味。  
`[\s\S]` で改行を考慮した任意の文字マッチが可能。
## `\w`
アルファベット、アンダーバー、数字。`[a-zA-Z_0-9]`と同等の意味。
## `\W`
アルファベット、アンダーバー、数字以外。`[^a-zA-Z_0-9]`と同等の意味。

# オプション(使用頻度が高いもののみ)
## `g`
最初の1個だけでなく、文字列の最後まで検索を繰り返す。  
グローバルマッチとも呼ばれる。  

【例】

```JavaScript
'test'.match(/t/g);
// ["t", "t"]
```

## `i`
大文字・小文字を区別しない。  

【例】

```JavaScript
'test'.match(/T/i);
// "t"
```

## `u`
文字コードをUTF-8

## `m`
改行を考慮可能。  

【例】

```JavaScript
`改行を
考慮できる
mオプション`.match(/オプション/m)[0];
// "オプション"
```

# おまけ
## `$1,$2,$3,...`
`()` で囲われた文字を参照用変数として、使用することができる。  
置換でよく使用する。  

【例】

```JavaScript
'7月10日'.replace(/(\d{1,2})月(\d{1,2})日/, '$1/$2');
// "7/10"
```