JS 正規表現
1. 正規表現(Regular Expressions)とは
正規表現(Regular Expression)は、サーチパターン(検索条件)を形成する一連の文字列です。
一般的にRegexという略称で呼ばれます。
JavaScriptにおいて、RegExpは正規表現を扱うためのオブジェクト(Object)です。
正規表現は主に以下の用途で使用されます:
- テキスト検索(Text searching)
- テキスト置換(Text replacing)
- テキストバリデーション(Text validation)
1.1 使用例
文字列の中から "volardev" を大文字・小文字の区別なく検索する例:
let text = "Visit Volardev.com";
// 文字列から /volardev/i パターンを検索
let n = text.search(/volardev/i);コードの解説:
/volardev/iは正規表現です。volardevはパターン(検索に使用される文字列)です。iは修飾子(大文字・小文字を区別せずに検索するためのフラグ)です。
2. 正規表現の構文(Syntax)
正規表現の基本的な書き方は以下の通りです:
/パターン/モディファイア(フラグ);
3. Stringメソッドの活用
正規表現は、多くの場合、以下のStringメソッド(文字列メソッド)と一緒に使用されます。
| メソッド | 説明 |
|---|---|
| match(regex) | マッチした結果を含む配列(Array)を返します。 |
| replace(regex) | 置換後の新しい文字列(String)を返します。 |
| search(regex) | 最初にマッチした箇所のインデックス(位置)を返します。 |
3.1 String match() の使用例
文字列の中から "Volardev" を検索します:
let text = "Visit Volardev";
// "Volardev" にマッチする部分を抽出
let n = text.match(/Volardev/);3.2 String replace() の使用例
文字列内の "Microsoft" を "Volardev" に置換します:
let text = "Visit Microsoft!";
// 大文字・小文字を区別せず "Microsoft" を置換
let result = text.replace(/Microsoft/i, "Volardev");3.3 String search() の使用例
文字列の中から "Volardev" を検索します:
let text = "Visit Volardev";
// マッチした箇所の開始位置を返す
let n = text.search(/Volardev/);4. 正規表現の論理和(OR)
正規表現において、オルタネーション(選択)は垂直バー | で表されます。| で区切られたいずれかの選択肢にマッチします。
4.1 使用例
(red|green|blue) のいずれかにマッチするものをグローバル検索する例:
let text = "Black, white, red, green, blue, yellow.";
// red, green, blue のいずれかにマッチするものをすべて検索
let result = text.match(/red|green|blue/g);5. JavaScript 正規表現フラグ(Flags)
/パターン/フラグ
正規表現フラグは、パターンの動作を制御するパラメータです。例えば、大文字・小文字の区別をなくしたり、文字列全体を検索したりすることができます。
一般的なフラグは以下の通りです:
| フラグ | 説明 |
|---|---|
| /g | グローバルマッチ(すべてのマッチ箇所を検索)を実行します。 |
| /i | 大文字・小文字を区別しないマッチングを実行します。 |
| /u | Unicodeサポートを有効にします(2015年の新機能)。 |
5.1 /g フラグ(Global)
/g フラグは、最初に見つかった箇所だけでなく、パターンに一致するすべての箇所にマッチします。
let text = "Is this all there is?";
const pattern = /is/g;
// 文字列内のすべての "is" を検索
let result = text.match(pattern);5.2 /i フラグ(Insensitive)
/i フラグは、マッチングにおいて大文字と小文字を区別しません。例えば /abc/i は "abc"、"AbC"、"ABC" のすべてにマッチします。
let text = "Visit Volardev";
const pattern = /volardev/i;
// 大文字・小文字を無視して検索
let result = text.match(pattern);6. 正規表現のメタ文字(Metacharacters)
メタ文字は、特別な意味を持つ文字です。
数字、単語、空白などを指定するために使用されます。
| メタ文字 | 説明 |
|---|---|
| \d | 数字(Digits)にマッチします。 |
| \w | 単語構成文字(Words)にマッチします。 |
| \s | 空白文字(Spaces)にマッチします。 |
6.1 \d (数字) メタ文字
\d メタ文字は、0から9までの数字にマッチします。
let text = "Give 100%!";
const pattern = /\d/g;
// すべての数字を検索
let result = text.match(pattern);6.2 \w (単語) メタ文字
\w メタ文字は、単語構成文字にマッチします。
これには、アルファベット(a-z, A-Z)、数字(0-9)、およびアンダースコア(_)が含まれます。
let text = "Give 100%!";
const pattern = /\w/g;
// すべての単語構成文字を検索
let result = text.match(pattern);7. 正規表現の量指定子(Quantifiers)
量指定子は、マッチさせる文字や式の数を定義します。
| コード | 説明 |
|---|---|
| x* | 0回以上の x の出現にマッチします。 |
| x? | 0回または1回の x の出現にマッチします。 |
| x{n} | n回の x の出現にマッチします。 |
7.1 ? 量指定子
x? は、x が 0回または 1回出現する場合にマッチします。
let text = "1, 100 or 1000?";
// "1" の後に 0回または1回の "0" が続くパターンを検索
const pattern = /10?/g;
let result = text.match(pattern);8. 正規表現のアサーション(Assertions)
アサーションは、境界(Boundaries)やルックアラウンド(Lookarounds)を指定します。
これには、文字列の境界や単語の境界、先行判定(Lookahead)、後行判定(Lookbehind)が含まれます。
| 構文 | 名称 | 説明 |
|---|---|---|
| ^ | 文字列境界 | 文字列の先頭にマッチします。 |
| $ | 文字列境界 | 文字列の末尾にマッチします。 |
| \b | 単語境界 | 単語の先頭または末尾にマッチします |
| (?=...) | 先行判定(Lookahead) | 後続の文字列が指定条件に一致するか確認します。 |
| (?<=...) | 後行判定(Lookbehind) | 前方の文字列が指定条件に一致するか確認します。 |
8.1 ^ メタ文字
^ メタ文字は、文字列の先頭にマッチします。
// 文字列が "Volardev" で始まるかテスト
const pattern = /^Volardev/;
let text1 = "Volardev Tutorial";
let result1 = pattern.test(text1); // true
let text2 = "Hello Volardev";
let result2 = pattern.test(text2); // false8.2 $ メタ文字
$ メタ文字は、文字列の末尾にマッチします。
// 文字列が "Volardev" で終わるかテスト
const pattern = /Volardev$/;
let text1 = "Hello Volardev";
let result1 = pattern.test(text1); // true
let text2 = "Volardev tutorial";
let result2 = pattern.test(text2); // false9. 正規表現の文字クラス(Character Classes)
文字クラスは、角括弧 [] で囲まれた文字の集合です。
括弧内のいずれかの文字にマッチします。
| クラス | 説明 |
|---|---|
| [a] | 括弧内の文字(この場合は a)にマッチします。 |
| [abc] | 括弧内のいずれかの文字(a, b, または c)にマッチします。 |
| [a-z] | aからzまでの範囲の任意の文字にマッチします。 |
| [0-9] | 0から9までの範囲の任意の数字にマッチします。 |
9.1 [0-9] の使用例
文字列内にある "0" から "9" までの数字をすべて検索する例:
let text = "More than 1000 times";
// 0から9までの数字をグローバル検索
const pattern = /[0-9]/g;
let result = text.match(pattern);