RegExp.escape 関数がない?JavaScriptで正規表現をエスケープする3つの方法
JavaScriptにおける正規表現のエスケープ処理
JavaScriptで正規表現を使用する際、特殊文字をパターンの一部として扱う場合、予期しない動作を引き起こす可能性があります。そこで、特殊文字をエスケープ処理する必要がある場面があります。
RegExp.escape 関数
残念ながら、JavaScriptにはネイティブな RegExp.escape
関数は存在しません。しかし、いくつかの方法でエスケープ処理を行うことができます。
方法1:文字列リテラルによるエスケープ
正規表現パターンを文字列リテラルとして記述する場合、バックスラッシュ (\
) を使用して特殊文字をエスケープすることができます。例えば、.
(ピリオド) をエスケープするには \.
と記述します。
const regex = /a\.b/; // a.b にマッチ
String.prototype.replace
メソッドを使用して、特殊文字をエスケープ文字に置き換えることができます。
function escapeRegExp(str) {
return str.replace(/[-[\]{}()*+?.,\\^$|]/g, "\\$&");
}
const regex = new RegExp(escapeRegExp("a*b")); // a\*b にマッチ
方法3:ライブラリの利用
escape-string-regexp
などのライブラリを使用することで、より簡単にエスケープ処理を行うことができます。
const regex = new RegExp(require('escape-string-regexp')('a*b')); // a\*b にマッチ
補足
- 正規表現パターンをコンストラクタで生成する場合、バックスラッシュはエスケープ処理する必要はありません。
- 自分でエスケープ処理を行う関数を定義する場合は、すべての特殊文字を網羅する必要があります。
JavaScriptにおける正規表現のエスケープ処理 - サンプルコード
const text = "100-0001";
const regex1 = /[0-9]{3}-[0-9]{4}/; // 正しい: 郵便番号のパターンにマッチ
const regex2 = new RegExp("\\d{3}-\\d{4}"); // 正しい: 郵便番号のパターンにマッチ
console.log(regex1.test(text)); // true
console.log(regex2.test(text)); // true
String.prototype.replace を使用したエスケープ
const text = "*ab$";
const regex = new RegExp(text.replace(/[-[\]{}()*+?.,\\^$|]/g, "\\$&"));
console.log(regex.test(text)); // true
const text = "*ab$";
const regex = new RegExp(require('escape-string-regexp')(text));
console.log(regex.test(text)); // true
説明
- 上記のコードは、いずれも
text
という変数に保存された文字列を正規表現パターンとしてエスケープ処理しています。 - 文字列リテラルによるエスケープ では、バックスラッシュ (
\
) を使用して特殊文字をエスケープしています。 - String.prototype.replace を使用したエスケープ では、
String.prototype.replace
メソッドを使用して、特殊文字をエスケープ文字に置き換えています。 - ライブラリの利用 では、
escape-string-regexp
ライブラリを使用して、エスケープ処理を行っています。
- これらの例は、基本的なエスケープ処理を示しています。より複雑なパターンを処理する場合は、適切なエスケープ処理を行う必要があります。
- どの方法を使用するかは、状況によって異なります。可読性やパフォーマンスなどを考慮して選択してください。
JavaScriptにおける正規表現のエスケープ処理 - その他の方法
Unicode コードポイントを使用したエスケープ
特殊文字をUnicodeコードポイントで表すこともできます。例えば、.
(ピリオド) は \u002E
と表すことができます。
const regex = new RegExp(/a\u002Eb/); // a.b にマッチ
正規表現クラスを使用して、特殊文字のグループをエスケープすることができます。例えば、\w
は英数字とアンダースコアにマッチします。
const regex = new RegExp(/\w*b/); // ab、a1b、_b などにマッチ
lookbehind と lookahead を使用したエスケープ
(?<=)
と (?=)
を使用して、後ろまたは前の文字列に基づいてパターンをマッチさせることができます。これにより、特殊文字をエスケープする必要がなくなる場合があります。
const regex = /a(?<=^)b/; // 最初の "a" と "b" にマッチ
const regex2 = /b(?=$)/; // 最後の "a" と "b" にマッチ
注意点
- Unicode コードポイントを使用したエスケープは、すべての環境で対応しているとは限りません。
- 正規表現クラスは、パターンをより複雑にする可能性があります。
- lookbehind と lookahead は、より高度なテクニックであり、理解が難しい場合があります。
JavaScript で正規表現をエスケープ処理するには、様々な方法があります。状況に応じて適切な方法を選択することが重要です。
javascript regex