web-dev-qa-db-ja.com

Javascriptの正規表現で使用するエスケープ文字列

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

ユーザー入力に基づいてJavaScriptの正規表現を作成しようとしています。

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

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

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

426
too much php

ショート&スウィート

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

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

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

インストール

Npmで escape-string-regexp として利用可能

npm install --save escape-string-regexp

MDNを見なさい:Javascriptガイド:正規表現

他の記号(〜 `!@#...)は結果なしにエスケープされるかもしれませんが、そうである必要はありません。

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

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

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

長い答え

上記の関数を使用する予定がある場合は、少なくともコードのドキュメントにあるこのスタックオーバーフローの投稿へのリンクを使用して、テストが困難なブードゥー教のようには見えないようにします。

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")
}());
879
CoolAJ86