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');
}
Также есть модуль 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, '\\$&');