ここでの式のほとんどは、単一の特定のユースケースを解決します。
それは大丈夫ですが、私は「常に機能する」アプローチを好みます。
function regExpEscape(literal_string) {
return literal_string.replace(/[-[\]{}()*+!<=:?.\/\\^$|#\s,]/g, '\\$&');
}
これは、正規表現での次の使用のためにリテラル文字列を「完全にエスケープ」します。
- 正規表現への挿入。例えば
new RegExp(regExpEscape(str))
- 文字クラスへの挿入。例えば
new RegExp('[' + regExpEscape(str) + ']')
- 整数カウント指定子への挿入。例えば
new RegExp('x{1,' + regExpEscape(str) + '}')
- 非JavaScript正規表現エンジンでの実行。
対象となる特殊文字:
-
:文字クラスに文字範囲を作成します。
[
/ ]
:文字クラスを開始/終了します。
{
/ }
:数値指定子を開始/終了します。
(
/ )
:グループを開始/終了します。
*
/ +
/ ?
:繰り返しタイプを指定します。
.
:任意の文字に一致します。
\
:文字をエスケープし、エンティティを開始します。
^
:一致するゾーンの開始を指定し、文字クラスでの一致を無効にします。
$
:一致するゾーンの終了を指定します。
|
:代替を指定します。
#
:自由間隔モードでコメントを指定します。
\s
:自由間隔モードでは無視されます。
,
:数値指定子の値を区切ります。
/
:式を開始または終了します。
:
:特別なグループタイプと、Perlスタイルの文字クラスの一部を完了します。
!
:ゼロ幅グループを無効にします。
<
/ =
:ゼロ幅グループ仕様の一部。
ノート:
/
正規表現の種類によっては、厳密には必要ありません。ただし、誰か(震動)が発生した場合に備えて保護しeval("/" + pattern + "/");
ます。
,
文字列が数値指定子で整数であることを意図している場合、暗黙的に間違ってコンパイルするのではなく、RegExpコンパイルエラーを適切に発生させます。
#
、および\s
JavaScriptでエスケープする必要はありませんが、他の多くのフレーバーでエスケープする必要があります。正規表現が後で別のプログラムに渡される場合に備えて、これらはここでエスケープされます。
JavaScriptの正規表現エンジン機能への追加の可能性に対する正規表現の将来性も保証する必要がある場合は、より偏執的な使用をお勧めします。
function regExpEscapeFuture(literal_string) {
return literal_string.replace(/[^A-Za-z0-9_]/g, '\\$&');
}
この関数は、将来の正規表現フレーバーの構文で使用されないことが明示的に保証されている文字を除いて、すべての文字をエスケープします。
真の衛生管理のために、次のエッジケースを検討してください。
var s = '';
new RegExp('(choice1|choice2|' + regExpEscape(s) + ')');
これは JavaScriptで正常にコンパイルされますが、他のフレーバーではコンパイルされません。別のフレーバーに渡そうとする場合はs === ''
、次のようにnullケースを個別にチェックする必要があります。
var s = '';
new RegExp('(choice1|choice2' + (s ? '|' + regExpEscape(s) : '') + ')');
RegExp.escape
現在取り組んでいる素晴らしい人々にあなたをアップデートしたかっただけであり、彼らが貴重なインプットを持っていると思っている人は誰でも貢献して大歓迎です。core-jsと他のポリフィルがそれを提供します。