JavaScript 速習チュートリアル

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大文字・小文字を区別しないマッチングを実行します。
/uUnicodeサポートを有効にします(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); // false

8.2 $ メタ文字

$ メタ文字は、文字列の末尾にマッチします。

// 文字列が "Volardev" で終わるかテスト
const pattern = /Volardev$/;
let text1 = "Hello Volardev";
let result1 = pattern.test(text1); // true

let text2 = "Volardev tutorial";
let result2 = pattern.test(text2); // false

9. 正規表現の文字クラス(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);