【初学者向け】正規表現で押さえておきたい最低限のポイント
目的
- 正規表現の概念を理解する
- 正規表現で押さえておくべき最低限のポイントを知る
対象読者
- 正規表現の初学者
1. 正規表現(Regular Expression)とは
文字列の検索、置換、抽出などを行なうためのパターンを記述する特殊な文字列のことです。
「こういう並びの文字を探してほしい」というルールを定義するために使用されます。
2. 主な役割
2-1. バリデーション(検証)
入力された文字列が特定の形式を満たしているかチェックします。
(例)郵便番号、メールアドレス、電話番号、パスワードの強度
例: 郵便番号
文字列全体が、定義された特定のルールに完全に合致しているかを確認します。
^\d{3}-\d{4}$
先頭 (^) から始まり、3桁の数字 (\d{3})、ハイフン (-)、4桁の数字 (\d{4}) が続き、末尾 ($) で終わることを検証します。
2-2. 検索と抽出
大量のテキストデータの中から、特定の規則性を持つ情報(例: すべての日付、特定のタグで囲まれたテキスト)を見つけ出して取り出します。
例: 時間(時と分)の抽出
(\d{1,2}):(\d{2})
1桁または2桁の数字(時)をグループ 1、コロン(:)、2桁の数字(分)をグループ 2としてキャプチャします。
2-3. 置換
特定のパターンに一致する文字列を一括で別の文字列に置き換えます。
const originalString = " Hello Wo rld";
const noSpaceString = originalString.replace(/\s/g/, '');
console.log(originalString); // 出力: " Hello Wo rld"
console.log(noSpaceString); // 出力: "Hello World"
正規表現の置換は、単に文字を置き換えるだけでなく、文字列の構造を変換します。
3. 正規表現の書き方と基本設定
3-1. デリミタ(/)
正規表現の開始と終了を表す記号です。
正規表現は、通常の文字列と区別するために、スラッシュ記号(/)で囲んで記述するのが一般的です。この区切り記号をデリミタと呼びます。
// スラッシュ(/)で囲まれた部分が正規表現
const pattern = /\d+/g;
3-2. フラグ(g, i)
フラグは、デリミタの閉じスラッシュの直後に付け加えるオプション設定です。
正規表現がどのように機能するかを制御します。
| フラグ | 名称 | 意味 | 使用例 |
|---|---|---|---|
| g | Global(グローバル) | 文字列全体で一致するすべてのパターンを対象とします |
/a/g:文字列中のすべての a に一致 |
| i | Ignore Case(大文字・小文字を無視) | 大文字と小文字を区別せず、パターンに一致させます |
/test/i:test、Test、TESTのいずれにも一致 |
※フラグがない場合、正規表現は最初に見つかったパターンで処理を終了します。例えば、replace() メソッドですべての空白を削除したい場合は、必ず g フラグが必要です。
4. パターン記述の基礎となる3つの要素
4-1. メタ文字(特定の文字を表現)
メタ文字は、特定の文字そのものではなく、「特定の性質を持つ文字」を表現する特殊な文字です。
| メタ文字 | 意味 | 表現する文字の例 |
|---|---|---|
\d |
Digit(数字) | "0, 1, 2, ..., 9" |
\w |
Word(単語文字) | 半角のアルファベット、数字、アンダースコア(_) |
\s |
Space(空白文字) | 半角スペース、全角スペース、タブ(\t)、改行(\n)など |
. |
Any character(任意の1文字) | 改行文字を除く、どんな文字でも1文字に一致 |
4-2. 量指定子(繰り返しを表現)
量指定子は、「直前の文字やグループがいくつ続くか」を定義します。
メタ文字や通常の文字と組み合わせて、繰り返しの回数を指定するために使われます。
| 量指定子 | 意味 | 表現 |
|---|---|---|
+ |
1回以上 |
\d+:数字が1個以上続く(例: 1、12345) |
* |
0回以上 |
\d*:数字が0個以上続く(例: """"、1、123) |
? |
0回または1回 |
colou?r:color または colour のどちらかに一致 |
{n} |
ちょうど n 回 |
\d{3}:数字がちょうど3回続く(例: 123) |
※{n} は直前の文字が繰り返される回数を指定しますが、(\d\w){3} のようにグループ化することで、パターン全体を繰り返しの対象にできます。
4-3. アンカー(位置を表現)
アンカーは、文字列の特定の位置を表すメタ文字です。特定の文字そのものではなく、「境界」を定義するために使用されます。特にバリデーション(検証)において非常に重要です。
| アンカー | 意味 | 用途 |
|---|---|---|
^ |
行/文字列の先頭 | パターンが文字列の最初から始まっているか検証する |
$ |
行/文字列の末尾 | パターンが文字列の最後で終わっているか検証する |
例: 郵便番号のバリデーション
^\d{3}-\d{4}$: 必ず文字列の最初から「3桁の数字 - 4桁の数字」のパターンがあり、必ず文字列の最後で終わる
5. グループ化とキャプチャ
丸括弧()の役割
5-1. グループ化
グループ化は、複数の文字やメタ文字をひとつのまとまり(単位)として扱いたいときに使用します。
例
| パターン | 意味 | 一致する例 |
|---|---|---|
AB+ |
Aと、Bが1回以上続く | "AB, ABBB" |
(AB)+ |
ABというまとまりが1回以上続く | "AB, ABAB, ABABAB" |
量指定子(+, *など)は通常、直前の文字ひとつにしか適用されません。しかし、() でグループ化することで、そのグループ全体に量指定子を適用できます。
※パイプ |
「または」を意味します。
文字列の選択肢を表すパイプを、グループ内だけで有効にしたい場合に使います。
(例)
(犬|猫)が好き は、「犬が好き」または「猫が好き」に一致
5-2. キャプチャ
キャプチャとは、() でグループ化されたパターンに実際に一致した文字列を一時的に記憶(保存)する機能です。この記憶された部分を「キャプチャグループ」と呼びます。
() を使うことで、文字列の特定の部分を「変数」のように扱えるようになります。
const date = "2025/02/01";
// 正規表現: (年)/(月)/(日)
// キャプチャグループの定義:
// $1 = 4桁の数字 (年: 2025)
// $2 = 2桁の数字 (月: 02)
// $3 = 2桁の数字 (日: 01)
const pattern = /(\d{4})\/(\d{2})\/(\d{2})/;
// 置換パターン: $1/$3/$2 (年/日/月)
const changedDate = date.replace(pattern, '$1/$3/$2');
console.log(changedDate); // 出力: "2025/01/02"
参考URL・文献
『新しいLinuxの教科書 第2版』
Discussion