Большинство выражений здесь решают единичные конкретные случаи использования.
Это нормально, но я предпочитаю подход "всегда работает".
function regExpEscape(literal_string) {
return literal_string.replace(/[-[\]{}()*+!<=:?.\/\\^$|#\s,]/g, '\\$&');
}
Это будет "полностью экранировать" литералСтрока для любого из следующих применений в регулярных выражениях:
- Вставка в регулярное выражение.Например,
new RegExp(regExpEscape(str))
- Вставка в класс символов.Например,
new RegExp('[' + regExpEscape(str) + ']')
- Вставка в спецификатор целого числа.Например,
new RegExp('x{1,' + regExpEscape(str) + '}')
- Выполнение в механизмах регулярных выражений, отличных от JavaScript.
Охватываемые специальные символы:
-
: создание диапазона символов вкласс символов. [
/ ]
: запуск / окончание класса символов. {
/ }
: запуск / окончание спецификатора нумерации. (
/ )
: запуск / завершение группы. *
/ +
/ ?
: указание типа повторения. .
: сопоставление с любымсимвол. \
: исключает символы и запускает объекты. ^
: указывает начало соответствующей зоны и отменяет сопоставление в классе символов. $
: указывает конец соответствующей зоны. |
: указывает на чередование. #
: указывает комментарий в свободном интервале. \s
: игнорируетсяв свободном интервале. ,
: разделяет значения в спецификаторе нумерации. /
: запускает или заканчивает выражение. :
: выполняет специальные gТипы групп и часть классов символов в стиле Perl. !
: Отрицание группы нулевой ширины. <
/ =
: Часть спецификаций группы нулевой ширины.
Примечания:
/
не является строго обязательным в любой разновидности регулярного выражения.Тем не менее, он защищает в случае, если кто-то (вздрагивает) делает eval("/" + pattern + "/");
. ,
гарантирует, что если строка должна быть целым числом в числовом спецификаторе, она будет правильно вызыватьошибка компиляции RegExp вместо тихой компиляции неправильно. #
и \s
не нужно экранировать в JavaScript, но делают во многих других вариантах.Они здесь экранированы на случай, если регулярное выражение будет позже передано другой программе.
Если вам также необходимо защитить регулярное выражение в будущем от потенциальных добавлений к возможностям механизма регулярных выражений JavaScript,Я рекомендую использовать более параноик:
function regExpEscapeFuture(literal_string) {
return literal_string.replace(/[^A-Za-z0-9_]/g, '\\$&');
}
Эта функция экранирует все символы, кроме явно гарантированных, что они не будут использоваться для синтаксиса в будущих разновидностях регулярных выражений.
Для по-настоящему гигиеническихИнтересно, рассмотрим этот крайний случай:
var s = '';
new RegExp('(choice1|choice2|' + regExpEscape(s) + ')');
Этот должен хорошо скомпилироваться в JavaScript, но не будет в некоторых других вариантах.Если вы намерены перейти к другому варианту, следует проверить независимый регистр s === ''
, например:
var s = '';
new RegExp('(choice1|choice2' + (s ? '|' + regExpEscape(s) : '') + ')');