Escape-строка для использования в регулярных выражениях Javascript [duplicate]

397

Возможный дубликат:
Есть ли функция RegExp.escape в Javascript?

Я пытаюсь создать регулярное выражение javascript на основе пользовательского ввода:

function FindString(input) {
    var reg = new RegExp('' + input + '');
    // [snip] perform search
}

Но регулярное выражение не будет работать корректно, когда пользовательский ввод содержит ? или *, потому что они интерпретируются как специальные выражения regex. На самом деле, если пользователь помещает в свою строку неуравновешенные ( или [, регулярное выражение даже не действует.

Что такое функция javascript для правильного удаления всех специальных символов для использования в регулярном выражении?

Теги:
escaping

1 ответ

871

Короткая 'n Sweet

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-строки-regexp

npm install --save escape-string-regexp

Заметка

См. MDN: Руководство по JavaScript: регулярные выражения

Другие символы (~ '! @#...) МОГУТ быть спасены без последствий, но не обязательно.

,

,

,

,

Тестовый пример: типичный URL-адрес

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

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

Длительный ответ

Если вы собираетесь использовать вышеприведенную функцию, по крайней мере, ссылку на эту запись в вашей документации по коду, чтобы она не выглядела как сумасшедший жесткий тест voodoo.

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")
}());
  • 19
    Вау, это многословно. Я предпочитаю версию Бобинса . Но все, что работает без необходимости избегать вещей ...
  • 2
    Я ожидаю, что все символы, которые ДОЛЖНЫ быть экранированы, а не только те, которые ДОЛЖНЫ быть экранированы, что и понимают такие линтеры, как JSLint.
Показать ещё 18 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню