Більшість виразів тут вирішують окремі конкретні випадки використання.
Це нормально, але я віддаю перевагу підходу "завжди працює".
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
: Ігнорується в режимі вільного інтервалу.
,
: Відокремлює значення в специфікаторі числення.
/
: Починає або закінчує вираз.
:
: Завершує спеціальні типи груп та частина класів символів у стилі Perl.
!
: Надає групу нульової ширини.
<
/ =
: Частина специфікацій групи нульової ширини.
Примітки:
/
не є строго необхідним в будь-якому ароматі регулярного вираження. Тим НЕ менше, він захищає в разі , якщо хто - то (тремтіння) робить eval("/" + pattern + "/");
.
,
гарантує, що якщо позначається, що рядок є цілим числом в числовому специфікаторі, вона належним чином спричинить помилку компіляції RegExp, а не мовчки скласти неправильно.
#
, і \s
не потрібно їх уникати в 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) : '') + ')');
RegExp.escape
зараз працюють, і кожен, хто вважає, що має цінний внесок, дуже вітається. core-js та інші поліфіли пропонують це.