Javascript эквивалент Perl\Q...\E или quotemeta()

В регулярных выражениях Perl вы можете окружать подвыражение с помощью \Q и \E, чтобы указать, что вы хотите, чтобы это подвыражение соответствовало литеральной строке, даже если там есть метасимволы. У вас также есть функция quotemeta, которая вставляет точно правильное число обратных косых черт в строке, чтобы, если вы впоследствии интерполируете эту строку в регулярное выражение, она будет сопоставляться буквально, независимо от ее содержимого.

Есть ли в Javascript (как в крупных браузерах) встроенный эквивалент? Я могу написать свое собственное, но я хотел бы знать, не нужно ли мне беспокоиться.

Ответы

Ответ 1

Нет такой встроенной функции.

Вместо того, чтобы реализовывать свои собственные, я советую вам изучить множество функций эвакуации регулярных выражений, доступных в Интернете.

Эта страница предлагает следующее решение (Colin Snover):

RegExp.escape = function(text) {
    return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
}

или советует использовать библиотеку XRegExp.

Ответ 2

Quotemeta не реализуется изначально, насколько я знаю, но я использовал это несколько месяцев назад только для этого:

function quotemeta (str) {
  // http://kevin.vanzonneveld.net
  // +   original by: Paulo Freitas
  // *     example 1: quotemeta(". + * ? ^ ( $ )");
  // *     returns 1: '\. \+ \* \? \^ \( \$ \)'
  return (str + '').replace(/([\.\\\+\*\?\[\^\]\$\(\)])/g, '\\$1');
}

Из http://phpjs.org/functions/quotemeta:496

Ответ 3

Также существует модуль quotemeta npm, который вы можете использовать в node.js или в браузере. Реализация заключается в том, чтобы процитировать все символы, отличные от слов, (сокращение от [^a-zA-Z0-9_]).

String(str).replace(/(\W)/g, '\\$1');

Это работает, потому что все символы, которые нуждаются в экранировании, не являются словами, в то время как другие символы, которые заканчивают побег, безвредны. Например, здесь процентный символ сбрасывается, но он по-прежнему соответствует обычно в RegExp, хотя его не нужно было экранировать:

if ("Hello%".match(RegExp(String("%").replace(/(\W)/g,'\\$1')))) { console.log("matched!"); } 

`` `

Кто-то разветкил модуль quotemeta и отметил, что захватные парсеры не нужны, поэтому регулярное выражение может быть дополнительно упрощено следующим образом:

String(str).replace(/\W/g, '\\$&');