Как избежать регулярного выражения в 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');
};
См. ссылка
Ответ 6
Mozilla рекомендует использовать эту функцию для символа espace из регулярного выражения:
function escapeRegExp(string){
return string.replace(/([.*+?^${}()|\[\]\/\\])/g, "\\$1");
}
Вы можете найти это в конце этой главы в Руководстве по JavaScript Javascript:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Using_Special_Characters
Ответ 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" будет выглядеть как регулярное выражение в моем первом примере - одна обратная косая черта перед каждым символом скобки.