Как избежать регулярного выражения в 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, "\\$&");
};
Если вы хотите использовать эту функцию, вам нужно будет включить приведенное выше определение где-то выше точки, где вы используете функцию в своем скрипте.
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);
Обратная косая черта удваивается, так что строка "шаблон" будет выглядеть как регулярное выражение в моем первом примере - одна обратная косая черта перед каждым символом скобки.