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

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

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

3 ответа

Решение

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

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

На этой странице предлагается следующее решение ( Колин Сновер):

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

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

Насколько мне известно, 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

Также есть модуль 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, '\\$&');
Другие вопросы по тегам