正規表現の動作について復習が必要な場合は、まずインタラクティブチュートリアルをご覧ください!
JavaScriptは、標準クラスRegExpを通じて正規表現をサポートしており、すべての最新のブラウザでネイティブに実装されています。一般的な実装は完全にPCREと互換性があるわけではありませんが、必要となる可能性のある正規表現のユースケースの大部分をサポートしています。
JavaScriptで正規表現を作成するには、新しいRegExpオブジェクトを、他の文字列と照合するパターンでインスタンス化する必要があります。このオブジェクトは、通常のJavaScriptコンストラクタを使用して作成することも、リテラル表記の省略記法を使用して作成することもできます。省略記法には、正規表現パターンでよく使用されるバックスラッシュやその他の特殊なメタ文字をさらにエスケープする必要がないという利点があります。
例えば、次の2つのステートメントは同等です。
// 英数字の文字列と照合するリテラル表記
var re = /\w+\d+/;
// 同じ正規表現オブジェクトのコンストラクタ表記
var re = new RegExp("\\w+\\d+");
リテラル表記は便利で、正規表現を読みやすくするので、以降の例ではこの形式を使用します。
RegExpオブジェクトには多くのトップレベルメソッドがあり、正規表現がJavaScriptの特定の文字列と一致するかどうかをテストするには、RegExp.test()を使用できます。正規表現を使用して文字列から情報を実際に抽出するには、代わりにRegExp.exec()呼び出しを使用できます。これにより、結果に一致に関する詳細情報が提供されます。
boolean = /正規表現/.test(inputStr)
matches = /正規表現/.exec(inputStr)
// 日付文字列と照合する正規表現を使用してみましょう。
var re = /([a-zA-Z]+) (\d+)/;
if (re.test("June 24")) {
// 確かに、「([a-zA-Z]+) (\d+)」という式は日付文字列と一致します。
// 必要であれば、代わりに文字列を検索してパターンが
// 入力文字列のどこに一致するのかを調べ、すべての一致とキャプチャ
// グループを取得することもできます。
var matches = re.exec("June 24");
// これは[0, 7)を出力します。これは、文字列の先頭と末尾と一致するためです。
var matchStart = matches.index;
var matchEnd = matchStart + matches[0].length;
console.log("Match at index " + matchStart + ", " + matchEnd);
// 結果には一致する値が含まれています。特に:
// matches[0]は常に完全に一致する文字列を返します
// matches[1]、matches[2]、…は、入力文字列内の左から右への順にキャプチャ
// グループを返します
// したがって、これは「June 24」を出力します
console.log("Full match: " + matches[0]);
// したがって、これは「June」を出力します
console.log("Month: " + matches[1]);
// したがって、これは「24」を出力します
console.log("Day: " + matches[2]);
} else {
// パターンが一致しない場合
console.log("The regex pattern does not match. :(");
}
RegExpフラグ新しい正規表現オブジェクトを作成する際には、他の文字列と照合する際の、パターンの使用方法を制御する追加のフラグを指定することもできます。具体的には、以下のフラグの組み合わせを使用できます。これらのフラグの一部は便宜上のものであり(パターンを変更することによっても表現できます)、一部は複雑な文字列で役立ちます。
フラグは、リテラル表記では正規表現の後に追加するか、通常の表記ではコンストラクタに渡します。
g - RegExp.exec()を複数回実行して、メソッドがnullを返すまで入力文字列内のすべての一致を見つけることができます。i - パターンを大文字と小文字を区別しないようにして、異なる大文字と小文字の文字列と一致させます。m - 入力文字列に改行文字(\n)がある場合に必要です。このフラグを使用すると、開始と終了のメタ文字(それぞれ^と$)は、入力文字列全体の先頭と末尾ではなく、各行の先頭と末尾と一致します。u - 正規表現をUnicodeコードポイントとして解釈します。// すべての一致(グローバルマッチング)を見つけて、大文字と小文字を区別しないマッチングを使用する
var re = /正規表現/gi;
// 2つのフラグを持つ同じ正規表現オブジェクトのコンストラクタ表記
var re = new RegExp("正規表現", "gi");
与えられた正規表現に基づいて、match、search、さらにはreplace部分文字列を行う文字列関数もあり、便利で使いやすいです。ただし、これらの呼び出しでは、フラグの動作がわずかに異なる場合があり、各呼び出しごとに新しい正規表現をコンパイルする必要があるため(単一の正規表現オブジェクトを作成して複数の文字列をテストする代わりに)、速度が遅くなる可能性があります。
matches = inputStr.match(/正規表現/flags)
index = inputStr.search(/正規表現/flags)
replacedStr = inputStr.replace(/正規表現/flags, searchStr)
// 大文字と小文字を区別しないマッチングをすべての
// 日付文字列に対して実行してみましょう。
var inputStr = "June 24";
var matches = inputStr.match(/(\w+) (\d+)/i);
// したがって、これは「June 24」を出力します
console.log("Full match: " + matches[0]);
// これは[0, 7)を出力します。これは、文字列の先頭と末尾と一致するためです。
var matchStart = matches.index;
var matchEnd = matchStart + matches[0].length;
console.log("Match at index " + matchStart + ", " + matchEnd);
// String.match()には、グローバルマッチングフラグが設定されている場合、
// 結果(キャプチャグループなし)のみが返され、一致オブジェクトは返されないという注意点があります。
// 例えば、以下は「June 24」、「Aug 13」、「Nov 5」を出力しますが、
// 各一致のインデックスは提供されません。
var inputStr = "June 24, Aug 13, Nov 5";
var matches = inputStr.match(/(\w+) (\d+)/g);
for (var i = 0; i < matches.length; i++) {
console.log(matches[i]);
}
// String.search()を使用して、入力文字列内の特定のパターンのインデックスを見つけることができます。
var inputStr = "There are 15 cats on the bed";
// これは10を出力します。これは、数字が見つかったインデックスです
console.log(inputStr.search(/\d+/));
// そのような一致がない場合は、-1を返します
console.log(inputStr.search(/123/));
// 一部の日付文字列を置き換えてみましょう
var inputStr = "June 24, August 9, Dec 12";
// グローバルフラグが設定されているため、これは「June 1, August 1, Dec 1」を出力します。
// そして、一致はすべての日付に適用されます
console.log(inputStr.replace(/\d+/g, "1"));
// 日付文字列の日と月の順序を入れ替えてみましょう
// 置換文字列には、キャプチャグループへの逆参照が含まれていることに注意してください。
var inputStr = "June 24, August 9, Dec 12";
// これは文字列の順序を入れ替え、「24 of June、9 of August、12 of Dec」を出力します
console.log(inputStr.replace(/(\w+) (\d+)/g, "$2 of $1"));
JavaScriptでの正規表現の使用に関する詳細については、次のリンクをご覧ください。