Как избежать регулярного выражения в 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 ответов:
этот вопрос заставил меня искать в Google для
RegEx.quote
функция в JavaScript, о которой я не знал. Получается, что функция существует только в одном месте, а именно в ответ Gracenote здесь на StackOverflow. Функция определяется следующим образом:RegExp.quote = function(str) { return (str+'').replace(/[.?*+^$[\]\(){}|-]/g, "\$&"); };
Если вы хотите использовать эту функцию, вам нужно будет включить приведенное выше определение где-то выше точки, где вы используете функцию в своем скрипте.
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" будет выглядеть как регулярное выражение в моем первом примере - одна обратная косая черта перед каждым символом скобки.