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


этот вопрос уже есть ответ здесь:

  • Есть ли регулярное выражение.функция escape в Javascript? 12 ответов

У меня есть следующий код:

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.цитата-это не функция".

я упускаю что-то простое?

8 90

8 ответов:

этот вопрос заставил меня искать в Google для RegEx.quote функция в JavaScript, о которой я не знал. Получается, что функция существует только в одном месте, а именно в ответ Gracenote здесь на StackOverflow. Функция определяется следующим образом:

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

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

С mozilla dev docs

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

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

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

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

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

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

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

EDIT:

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

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

вот точная функция, которую использует библиотека закрытия 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, '\').
      replace(/\x08/g, '\x08');
};

посмотреть ссылке

Mozilla рекомендует использовать эту функцию для выделения символа из регулярного выражения:

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

вы можете найти это в конце этой главы в руководстве Mozilla Javascript: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Using_Special_Characters

предыдущие ответы избежать слишком много символов.

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

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

затем эта функция делает трюк:

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

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

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

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

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

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