正規表現(Regular Expression)

## はじめに
会社の上司から正規表現について教えていただきました。(大感謝いつもありがとうございます)
知識定着&もっと詳しく知りたいと思い、学んだ内容を記事に残します。

## 正規表現とは
文字列の検索や置換を行うために使用されるパターンマッチング技法。
正規表現は特殊な記号を用いて、検索や置換の対象となる文字列のパターンを表現する。

正規表現は特定の文字列やパターンを見つけたり、ログファイルから重要な情報を抽出したり、ユーザー入力の検証を行なったりするために使われることが多い様子。

## 正規表現の一般的な構成要素
1. **リテラル**：直接文字としてマッチする文字(例："a"や"1"など)
2. **メタ文字**：特殊な意味を持つ記号で、パターンを表現するために使用される(例:"."や"*"など)
3. **量指定子**：直前の要素が何回繰り返し現れるかを指定する記号（例："+"や"?"など）
4. **キャプチャグループ**：かっこの中にいくつかのメタ文字やリテラルを含めることができる。グループを使って一致させたい部分を取り出すことができる（例："(a-z)"）

## メタ文字
正規表現内で特殊な意味を持ち、パターンの構造を定義するために使用される。
以下に、一般的と言われるメタ文字の種類とその説明を示す。

1. `.`：　任意の一文字を表す。ただし、改行文字は含まれない
2. `^`：　文字列の先頭を表す
3. `$`：　文字列の末尾を表す
4. `*`：　直前の要素が**0回以上**繰り返されることを表す
5. `+`：　直前の要素が**1回以上**繰り返されることを表す  
6. `?`：　直前の要素が**0回または1回**繰り返されることを表す
7. `{m,n}`：　直前の要素が最低m回、最大n回繰り返されることを表す
8. `(...)`：　グループを作成し、グループ内の要素をまとめて処理する。また、キャプチャグループとして扱われ、マッチした部分文字列を参照できる
9. `[...]`：　文字クラスを表し、角括弧内のいずれか1文字と一致する
10. `|`：　または(OR)の意味を持つ。複数のパターンのうちどれか1つに一致することを表す
11. `\`：　エスケープ文字で、直後に続く特殊文字をリテラル文字として扱う。また、特定の文字のエスケープシーケンス(`\d`や`\s`など)を指定するために使用される
12. `\d`：　任意の1桁の数字を表す。[0-9]と等価
13. `\D`：　`\d`の否定で、数字以外の任意の1文字を表す。`[^0-9]`と等価　（`^`が角括弧の先頭にある場合は、正規表現の文字列クラス内で否定を表す） 
14. `\w`：　任意の英文字またはアンダースコアを表す。`[a-zA-Z0-9_]`と等価
15. `\W`：　`\w`の否定で、英数字・アンダースコア以外の任意の1文字を表す。`[^a-zA-z0-9_]`と等価
16. `\s`：　空白文字(スペース、タブ、改行など)を表す
17. `\S`：　`\s`の否定で、空白文字以外の任意の1文字を表す

## 量指定子
正規表現において前にある要素の前にある要素の繰り返し回数を指定されるために使用される。
以下に一般的と言われている量指定子の種類と説明を示す。

1. `*`：　直前の要素が0回以上繰り返されることを表す。（例：　`a*`は"a"の0回以上の繰り返しに一致する→空文字、""、"a"、"aa"、"aaa"など）
2. `+`：　直前の要素が1回以上繰り返されることを表す。（例： `a+`は"a"の１回以上の繰り返しに一致する→"a"、"aa"、"aaa"など）
3. `?`：　直前の要素が0回または1回繰り返されることを表す。（例：　`a?`は"a"の0回または1回の繰り返しに一致する→空文字または"a"）
4. `{n}`：　直前の要素がちょうどn回繰り返されることを表す。（例：　`a{3}`は、"a"がちょうど3回繰り返す文字列に一致する→"aaa"）
5. `{m,n}`：　直前の要素が最低m回、最大n回繰り返されることを表す。（例：　`a{2,4}`は"a"が2〜4回繰り返す文字列に一致する→"aa"、"aaa"、"aaaa"）
6. `{n,}`：　直前の要素がn回以上繰り返されることを表す。（例：　`a{2,}`は、"a"が少なくとも2回繰り返す文字列に一致する→"aa"、"aaa"、"aaaa"など）   

## キャプチャグループ
正規表現において一致する部分文字列をグループ化し、後で参照したり、置換に利用できるようにするための機能。

キャプチャグループは丸括弧`()`で囲むことによって定義される。
正規表現の一部分をキャプチャグループとして扱うと、以下の利点がある。

1. 部分的マッチの取得：　キャプチャグループで定義された部分マッチを直接取得できる。これにより、正規表現全体がマッチする代わりに特定の部分のみを抽出できる。
2. 置換：　キャプチャグループを使用して、マッチした文字列の一部を新しい文字列で置換することができる。
3. 量指定子の適用：　キャプチャグループに量指定子を適用することで、グループ全体の繰り返しを表現できる。

（例1）電話番号の抽出
入力文字列：　`Phone: 123-456-7890`
正規表現: `(\d{3})-(\d{3})-(\d{4})`

この正規表現では、3つのキャプチャグループがある。
各キャプチャグループは3桁または4桁の数字の連続を表している。

- キャプチャグループ1: (\d{3}) → "123"
- キャプチャグループ2: (\d{3}) → "456"
- キャプチャグループ3: (\d{4}) → "7890"

（例2）キャプチャグループの置換
入力文字列：　`"12/06/2021"`
正規表現：　`(\d{2})/(\d{2})(\d{4})`
置換文字列: `$3-$2-&1`
結果：　`2021-06-12`

この例では、日付を記述する入力文字列から、キャプチャグループを利用して書式を変更している。
置換文字列の`$1`、`$2`、`$3`はそれぞれのキャプチャグループのマッチした文字列を参照している。

## 注意
正規表現の挙動は使用しているプログラミング言語やツールによって微妙に異なる場合があるようなので、適切なドキュメントやリファレンスを確認することをお勧めします。

## 便利ツール
[regex101](https://regex101.com/)というオンラインの正規表現テストツールがあると上司に教えていただきました！

[regex101](https://regex101.com/)の主な機能は以下のとおりです。
1. リアルタイムのマッチ結果：入力した正規表現とテスト対象の文字列が、リアルタイムで一致するかどうか表示されます。正規表現やテスト対象文字列を変更すると、結果もすぐに更新されるため、素早くマッチングを確認できます。
2. 正規表現構文のハイライト：正規表現入力フィールドでは、メタ文字やリテラル文字が異なる色で強調表示されるため、正規表現が読みやすくなります。
3. マッチグループの表示：　キャプチャグループが使用されている場合、マッチした部分文字列を個別に表示してくれます。
4. FLAVORの選択：　複数のプログラミング言語やツールに対応しています。異なる言語の正規表現の挙動を確認できます。
5. 正規表現の保存と共有：　正規表現を保存して共有する機能も提供されている。他の人と正規表現を簡単に共有できます。

以上のように、[regex101](https://regex101.com/)は正規表現の作成やデバッグをシームレスに行うことができる便利で強力なオンラインツールなので私も積極的に活用していきたいです^^

内容は以上となります。