Javascript 正規表現で使用するエスケープ文字列 [重複] 質問する

Javascript 正規表現で使用するエスケープ文字列 [重複] 質問する

重複の可能性あり:
Javascript に RegExp.escape 関数はありますか?

ユーザー入力に基づいて JavaScript 正規表現を構築しようとしています:

関数FindString(入力) {
    var reg = new RegExp('' + input + '');
    // [snip] 検索を実行する
}

しかし、ユーザー入力に または が含まれている場合、それらは正規表現の特殊文字として解釈されるため、正規表現は正しく機能しません?*実際、ユーザーが文字列に不均衡な(またはを入力した場合[、正規表現は有効ではありません。

正規表現で使用するためにすべての特殊文字を正しくエスケープする JavaScript 関数は何ですか?

ベストアンサー1

RegExp 自体をエスケープするには:

function escapeRegExp(string) {
    return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}

置換文字列をエスケープするには:

function escapeReplacement(string) {
    return string.replace(/\$/g, '$$$$');
}

エスケープされたすべての RegExp 文字:

escapeRegExp("All of these should be escaped: \ ^ $ * + ? . ( ) | { } [ ]");
>>> "All of these should be escaped: \\ \^ \$ \* \+ \? \. \( \) \| \{ \} \[ \] "

文字列を検索して置換します:

var haystack = "I love $x!";

var needle = "$x";
var safeNeedle = escapeRegExp(needle); // "\\$x"

var replacement = "$100 bills"
var safeReplacement = escapeReplacement(replacement); // "$$100 bills"

haystack.replace(
  new RegExp(safeNeedle, 'g'),
  escapeReplacement(safeReplacement),
);
// "I love $100 bills!"

:上記はオリジナルの回答ではありません。MDNから1つつまり、以下の npm のコードの内容とは一致せず、以下の長い回答に示されている内容とも一致しません。コメントもわかりにくくなっています。私の推奨事項: 上記を使用するか、MDN から取得し、この回答の残りの部分は無視してください。-Darren、2019 年 11 月)

インストール

npmで入手可能エスケープ文字列正規表現

npm install --save escape-string-regexp

注記

見るMDN: Javascript ガイド: 正規表現

その他の記号 (~`!@# ...) は、影響なくエスケープできますが、必須ではありません。

テストケース: 典型的なURL

escapeRegExp("/path/to/resource.html?search=query");

>>> "\/path\/to\/resource\.html\?search=query"

長い答え

上記の関数を使用する場合は、少なくともコードのドキュメントでこの Stack Overflow の投稿にリンクして、テストが難しい奇妙な魔法のように見えないようにしてください。

var escapeRegExp;

(function () {
  // Referring to the table here:
  // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/regexp
  // these characters should be escaped
  // \ ^ $ * + ? . ( ) | { } [ ]
  // These characters only have special meaning inside of brackets
  // they do not need to be escaped, but they MAY be escaped
  // without any adverse effects (to the best of my knowledge and casual testing)
  // : ! , = 
  // my test "~!@#$%^&*(){}[]`/=?+\|-_;:'\",<.>".match(/[\#]/g)

  var specials = [
        // order matters for these
          "-"
        , "["
        , "]"
        // order doesn't matter for any of these
        , "/"
        , "{"
        , "}"
        , "("
        , ")"
        , "*"
        , "+"
        , "?"
        , "."
        , "\\"
        , "^"
        , "$"
        , "|"
      ]

      // I choose to escape every character with '\'
      // even though only some strictly require it when inside of []
    , regex = RegExp('[' + specials.join('\\') + ']', 'g')
    ;

  escapeRegExp = function (str) {
    return str.replace(regex, "\\$&");
  };

  // test escapeRegExp("/path/to/res?search=this.that")
}());

おすすめ記事