Как избежать регулярного выражения в javascript?

У меня есть код вроде:

pattern = 'arrayname[1]'; // fetch from dom, make literal here just for example
reg = new RegExp(RegExp.quote(pattern), 'g');
mystring.replace(reg, 'arrayname[2]');

но он не работает с сообщением об ошибке: "RegExp.quote не является функцией".

Я пропустил что-то простое?

Ответ 1

Этот вопрос заставил меня искать в Google функцию RegEx.quote в JavaScript, о которой я не знал. Оказывается, что функция существует только в одном месте, а именно в fooobar.com/questions/1808/.... Функция определяется следующим образом:

RegExp.quote = function(str) {
    return (str+'').replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&");
};

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

Ответ 2

Из mozilla dev docs

function escapeRegExp(string){
  return string.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
}

Это необычно, но в этом конкретном сценарии я создавал бы такую ​​функцию

RegExp.escape = function(str) {
  return String(str).replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
};

Использование

new RegExp(RegExp.escape('http://www.google.com'));
//=> /http\:\/\/www\.google\.com/

Ответ 3

Если вы буквально заменяете, вам не нужно иметь регулярное выражение:

str = str.split(search).join(replace)

Ответ 4

var easiest = any_string.replace(/\W/g, "\\$&");

EDIT:

Почему я должен помнить, какие символы имеют особое значение или даже использовать функцию, если достаточно избегать любого символа, отличного от слова?

Мое решение - не проблема, может быть, поэтому он проголосовал.: D

Ответ 5

Вот точная функция, используемая библиотекой закрытия Google.

/**
 * Escapes characters in the string that are not safe to use in a RegExp.
 * @param {*} s The string to escape. If not a string, it will be casted
 *     to one.
 * @return {string} A RegExp safe, escaped copy of {@code s}.
 */
goog.string.regExpEscape = function(s) {
  return String(s).replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g, '\\$1').
      replace(/\x08/g, '\\x08');
};

См. ссылка

Ответ 7

Предыдущие ответы сбрасывают слишком много символов.

В соответствии с Какие специальные символы должны быть экранированы в регулярных выражениях?, должны быть экранированы только следующие символы:

  • .^$*+?()[{\| классы внешних символов.
  • ^-]\ внутри классов символов.

Тогда эта функция выполняет трюк:

function escapeRegExp(str) {
    return str.replace(/[.^$*+?()[{\\|\]-]/g, '\\$&');
}

Ответ 8

Ну, в первую очередь вы можете определить регулярное выражение с его собственным постоянным синтаксисом:

var reg = /arrayname\[1\]/;

Внутри обычного выражения вы указываете вещи с обратной косой чертой. Теперь, если вы начинаете с строки, вам нужно "защитить" эти обратные косые черты внутри строковой константы. В этом случае шаблон анализируется дважды: один раз, когда строковая константа поглощается парсером Javascript, а затем один раз конструктором RegExp:

var pattern = "arrayname\\[1\\]";
var reg = new RegExp(pattern);

Обратные косые черты удваиваются, так что строка "pattern" будет выглядеть как регулярное выражение в моем первом примере - одна обратная косая черта перед каждым символом скобки.