JavaScript

レシピ

正規表現

正規表現で文字列から特定の文字を検索する

正規表現を使って文字列から特定の文字列を検索する方法について解説します。

この記事のポイント

  • JavaScriptの正規表現を使った検索方法は大きく分けて3パターン
  • 正規表現で検索するメソッドは5つ用意されている
  • RegExpオブジェクトのメソッドとStringオブジェクトのメソッドがある

目次

JavaScriptで正規表現を使う

正規表現を使うと柔軟な文字列検索が実装できるため非常に便利です。
JavaScriptの正規表現は次の3通りの使い方があります。

  1. 使い方1. Stringオブジェクトのメソッドを使う(パターンをテキストで指定)
  2. 使い方2. Stringオブジェクトのメソッドを使う(パターンをRegExpオブジェクトで指定)
  3. 使い方3. RegExpオブジェクトのメソッドを使う

言葉だけだとイメージが掴みづらいと思います。
以降は、それぞれの使い方をコードと出力結果を交えて解説していきます。

使い方1 Stringオブジェクトのメソッドを使う(パターンをテキストで指定)

文字列にmatchメソッドを使って検索を行います。
正規表現のパターンはmatchメソッドに直接指定します。

コード例

var text = 'I like cat. Cat is so cute.';

// 検索を実行
var matches = text.match( /cat/gi);
console.log(matches);
// (2) ["cat", "Cat"]

正規表現のパターンをmatchメソッドにパラメータで「/cat/gi」と指定して検索する方法です。

このパターンでは「cat」という文字列を検索するワードと、2つのフラグを指定しています。
gフラグは全件検索を行うフラグで、iフラグはアルファベットの大文字/小文字を区別しないで検索するフラグです。
この2つのフラグがあることで、パターンで指定した全て小文字の「cat」のみでなく、「Cat」「CAT」「caT」のように大文字と小文字が混在していてもマッチするようになります。

上記の検索結果はcatが2つヒットし、変数matchesを出力すると配列形式でヒットしたワードが出力されます。

メソッドのパラメータに正規表現を直接指定する方法は最もシンプルで手軽な方法です。
ただし、検索ワードに変数の値を使うような動的な指定ができません。
もし変数を使って動的にワードを指定したいときは、以下の方法を使います。

使い方2 Stringオブジェクトのメソッドを使う(パターンをRegExpオブジェクトで指定)

2つ目の方法は上記と同じメソッドを使って検索を行いますが、正規表現のパターンの指定にRegExpオブジェクトを使います。

検索ワードの指定には変数の値を使うことも可能です。
ここでは検索するワードを変数search_wordに入れて、この変数の値を使ってパターンに指定します。

コード例

var text = 'I like cat. Cat is so cute.';
var search_word = 'cat';

// 正規表現を作成
var regexp = new RegExp( search_word, 'gi');

// 検索を実行
var matches = text.match(regexp);
console.log(matches);
// (2) ["cat", "Cat"]

手順は違いますが、出力結果は先ほどと同じです。

この方法のポイントはRegExpオブジェクトを作成するところで、第1パラメータに変数search_wordの値を渡し、第2パラメータにフラグを指定します。(指定するフラグも上記と同様です)
作成したインスタンスは変数regexpに入れて、matchメソッドに渡して検索を行います。

使い方3 RegExpオブジェクトのメソッドを使う

3つ目の方法は、正規表現のオブジェクトであるRegExpオブジェクトからメソッドを呼び出して検索する方法です。

コード例

var text = 'I like cat. Cat is so cute.';
var search_word = 'cat';

// 正規表現オブジェクトを作成
var regexp = new RegExp( search_word, 'gi');

// 検索を実行
while(matches = regexp.exec(text)){
	console.log(matches);
}
// ["cat", index: 7, input: "I like cat. Cat is so cute.", groups: undefined]
// ["Cat", index: 12, input: "I like cat. Cat is so cute.", groups: undefined]

RegExpオブジェクトを作成して変数regexpに入れるまでは2つ目の方法と同じです。

while文の中でexecメソッドを実行していますが、このメソッドにパラメータとして検索する文字列を指定しており、上記2つの方法とは記述する順番が正反対です。
これはexecメソッドRegExpオブジェクトだけで使うことができるメソッドだからです。

execメソッドは1つマッチすると検索を終了しますが、2回目以降は前回マッチした文字列以降から検索を再開します。
上記の文字列では、1回目の実行では「I like cat」でマッチしますが、2回目はその後ろの「. Cat is …」から検索を再開します。

最終的にマッチする文字列が見つからない場合は-1を返すので、そのときにwhile文も終了して検索完了となります。

正規表現の検索メソッド一覧

正規表現の使い方を3通りみてきましたが、JavaScriptには正規表現で文字列の検索をするメソッドが全部で5つ用意されています。
各メソッドは戻り値や検索範囲に違いがありますが、大きく分けるとStringオブジェクトのメソッドとRegExpオブジェクトのメソッドで分けることができます。

以下の表は5つのメソッドの特徴の一覧です。

メソッド名内容使用できるオブジェクト
execメソッドパラメータで渡した文字列からパターンにマッチする文字列を検索するメソッド。マッチすると結果データを配列形式で返し、見つからない場合はnullを返します。RegExpオブジェクト
testメソッドパラメータで渡した文字列からパターンにマッチする文字列を検索するメソッド。マッチするとtrue、見つからない場合はfalseを返します。RegExpオブジェクト
matchメソッド文字列からパラメータで渡したパターンにマッチする文字列を検索するメソッド。gフラグがない場合は1件でもマッチしたら検索を終了します。マッチすると結果データを配列形式で返し、見つからない場合はnullを返します。Stringオブジェクト
matchAllメソッド文字列からパラメータで渡したパターンにマッチする文字列を全て検索するメソッド。gフラグの指定が必須です。マッチした全ての結果データを含むRegExpStringIteratorを返します。Stringオブジェクト
searchメソッド文字列からパラメータで渡したパターンにマッチする文字列を検索し、最初にマッチした文字列の開始位置を返すメソッド。もしマッチしない場合は-1を返します。Stringオブジェクト

それぞれのメソッドの使い方については、別記事「JavaScriptの正規表現」の「使用例」を参照してください。

こちらの記事は役に立ちましたか?

ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。

コメントありがとうございます!
運営の参考にさせていただきます。