Как избежать регулярного выражения в 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 не функция".

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

8 ответов

Решение

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

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

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

Из документации Mozilla Dev

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/

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

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

РЕДАКТИРОВАТЬ:

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

Мое решение - ежу понятно, может быть, поэтому оно проголосовало.: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, '\\$1').
      replace(/\x08/g, '\\x08');
};

Смотрите ссылку

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

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

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

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

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

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

Затем эта функция делает свое дело:

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

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

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

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

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

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

Другие вопросы по тегам