HOWTO · JavaScript

JavaScript で PHP の preg_match() に相当する方法

この記事では、preg_match 関数の目的と、JavaScript で同じ機能を実装する方法を例を使って学習します。

このページの内容

JavaScript で preg_match() と検索する場合、通常は文字列を正規表現で検査する方法か、一致したテキストを取得する方法を探しています。JavaScript に preg_match() という組み込み関数はありません。一致するかどうかだけを調べるには RegExp.prototype.test() を、一致の詳細が必要なら String.prototype.match() を使います。どちらを選ぶかは、その後のコードで必要な処理によって決まります。

PHP の preg_match() を理解する

PHP の preg_match() は、パターンと対象文字列を受け取り、省略可能な3番目の引数に一致データを格納できます。構文は preg_match($pattern, $subject, $matches) です。

戻り値は単なる真偽値ではありません。パターンが一致すると 1、一致しないと 0、エラーが発生すると false です。一致した場合、省略可能な $matches 引数にはキャプチャされたテキストが格納されます。この違いは条件式を移植するときに重要です。JavaScript の test() は真偽値を返す一方、match() は一致データまたは null を返します。

JavaScript で使う同等の方法: test() と match() の選び方

JavaScript に preg_match() と直接同じ関数はありません。test() と match() はどちらも JavaScript の正規表現を使いますが、役割は異なります。後続のコードでパターンに一致する箇所があるかどうかだけを知りたい場合は、test() を選びます。一致した部分文字列、キャプチャグループ、一致位置が必要なら match() を選びます。PHP のように一致の有無だけを調べるなら test() を使います。省略可能な $matches のデータに相当する情報が必要なら match() を使い、戻り値の形の違いも考慮してください。

一致するかどうかだけを調べるには test() を使う

正規表現に対して test() を呼び出し、調べる文字列を渡します。文字列内のどこかで式に一致すると true、そうでなければ false を返します。この例では、テキストに hello という単語が含まれるかを調べます。

次の例を実行します。コード例中の文字列と表示内容は英語のままです。

const pattern = /hello/;
const text = "hello world";
console.log(pattern.test(text));
true

提示された実行では、この例は true を出力しました。反対の結果を確認するには、hello を含まない文字列を試してください。JavaScript の test() の仕様上、呼び出し結果は false になります。これは入力検証の条件式に使えますが、パターン自体で検証したい形式全体を表す必要があります。たとえば、数字を見つけるだけのパターンでは入力全体が数字だけで構成されているとは確認できません。文字列全体を一致させるにはアンカーを使います。

一致内容を取得するには match() を使う

文字列に対して match() を呼び出し、正規表現を渡します。g フラグのない正規表現では、一致すると最初の要素に全体の一致を格納した配列が返ります。キャプチャグループや index などのプロパティから、追加の情報を取得できます。一致しない場合は null が返るため、配列のプロパティを読む前に null かどうかを確認してください。

このセクションのコードと表示されるラベルや出力は英語のままです。

const text = "Order 42 is ready";
const result = text.match(/Order (\d+)/);

if (result !== null) {
  console.log(result[0]);
  console.log(result[1]);
  console.log(result.index);
} else {
console.log("No match");
}
Order 42
42
0

提示された実行では、この例は全体の一致 Order 42、キャプチャされた数字 42、開始位置のインデックス 0 を出力しました。コード例中の文字列と表示内容(No match を含む)は英語のままです。パターンが一致しない場合、result は null となり、代替処理の分岐が実行されます。PHP の省略可能な $matches 引数とは異なり、JavaScript ではメソッド呼び出しが結果を直接返します。

フラグとよくある注意点

JavaScript の正規表現フラグは照合の動作を変えます。既定では大文字と小文字を区別します。/hello/i のように i を追加すると、大文字と小文字を区別せずに照合できます。g フラグを付けると、match() の戻り値の形が変わります。text.match(/\d+/g) は、一致した数字列すべてを含む配列を返し、一致がない場合は null を返します。このグローバル検索では、非グローバルな match() の呼び出しで得られる各一致の index やキャプチャグループの詳細は含まれません。特定の一致のキャプチャグループや位置が必要な場合は、非グローバルな式を使ってください。

g または y フラグ付きの正規表現を test() とともに再利用するときは注意してください。このような式は lastIndex の位置を保持するため、検索位置が進むにつれて、呼び出しを繰り返したときの結果が交互に変わることがあります。毎回独立した真偽値判定を行うには、こうした状態を持つフラグを省くか、判定のたびに lastIndex をリセットします。また、., *, ? などの文字はパターン内で特別な意味を持つことも覚えておきましょう。文字そのものに一致させるにはバックスラッシュでエスケープします。部分文字列ではなく文字列全体をパターンに一致させる場合は、^ や $ などのアンカーを使います。