Есть ли регулярное выражение.функция escape в Javascript?
Я просто хочу создать регулярное выражение из любой возможной строки.
var usersString = "Hello?!*`~World()[]";
var expression = new RegExp(RegExp.escape(usersString))
var matches = "Hello".match(expression);
есть ли встроенный метод для этого? Если нет, то что люди используют? У Руби есть RegExp.escape. Я не чувствую, что мне нужно писать свой собственный, там должно быть что-то стандартное. Спасибо!
12 ответов:
функция, связанная выше, недостаточна. Он не может убежать
^или$(начало и конец строки), или-, который в группе символов используется для диапазонов.использовать эту функцию:
RegExp.escape= function(s) { return s.replace(/[-\/\^$*+?.()|[\]{}]/g, '\$&'); };хотя это может показаться ненужным на первый взгляд побег
-(а также^) делает функцию подходящей для экранирования символов, которые будут вставлены в класс символов, а также в тело регулярного выражения.побег
/делает функция, подходящая для экранирования символов, которые будут использоваться в литерале JS regex для последующего eval.поскольку нет никакого недостатка в том, чтобы избежать любого из них, имеет смысл бежать, чтобы охватить более широкие случаи использования.
и да, это разочаровывает неудача, что это не является частью стандартного JavaScript.
для тех, кто использует lodash,С V3.0.0 a _.escapeRegExp - это встроенный:
_.escapeRegExp('[lodash](https://lodash.com/)'); // → '\[lodash\]\(https:\/\/lodash\.com\/\)'и, в случае, если вы не хотите требовать полную библиотеку lodash, вам может потребоваться только эта функция!
большинство выражений здесь решают отдельные конкретные случаи использования.
это нормально, но я предпочитаю "всегда действует".
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 + "/");.,гарантирует, что если строка должна быть целым числом в числовом спецификаторе, это правильно вызовет ошибку компиляции регулярного выражения вместо того, чтобы молча компилировать неправильно.#и\sне нужно экранировать в JavaScript, но делать во многих других вариантах. Они экранируются здесь в случае, если регулярное выражение будет позже передано другая программа.
Если Вам также нужно будущее доказательство регулярное выражение против потенциальных дополнений к возможностям JavaScript regex engine, я рекомендую использовать более параноидальный:
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) : '') + ')');
в виджете автозаполнения jQueryUI (версия 1.9.1) они используют немного другое регулярное выражение (строка 6753), вот регулярное выражение в сочетании с подходом @bobince.
RegExp.escape = function( value ) { return value.replace(/[\-\[\]{}()*+?.,\\^$|#\s]/g, "\$&"); }
руководство Mozilla Developer Network по регулярным выражениям обеспечивает эту функцию экранирования:
function escapeRegExp(string){ return string.replace(/([.*+?^${}()|\[\]\/\])/g, "\"); }
ничто не должно помешать вам просто избежать каждого не буквенно-цифрового символа:
usersString.replace(/(?=\W)/g, '\');вы теряете определенную степень читаемости при выполнении
re.toString()но вы выигрываете много простоты (и безопасности).согласно ECMA-262, с одной стороны, регулярное выражение "синтаксические символы" всегда не являются буквенно-цифровыми, так что результат является безопасным, и специальные escape-последовательности (
\d,\w,\n) всегда буквенно-цифровые такие, что нет ложных контрольные побеги будут произведены.
есть предложение ES7 для регулярного выражения.побег в https://github.com/benjamingr/RexExp.escape/, с полифилл доступным на https://github.com/ljharb/regexp.escape.
это более короткая версия.
RegExp.escape = function(s) { return s.replace(/[$-\/?[-^{|}]/g, '\$&'); }Это включает в себя не-мета символов
%,&,'и,, но спецификация JavaScript RegExp позволяет это.
escapeRegExp = function(str) { if (str == null) return ''; return String(str).replace(/([.*+?^=!:${}()|[\]\/\])/g, '\'); };
XRegExp имеет функцию escape:
XRegExp.escape('Escaped? <.>'); // -> 'Escaped\?\ <\.>'More on:http://xregexp.com/api/#escape
вместо того, чтобы только экранировать символы, которые вызовут проблемы в вашем регулярном выражении (например: черный список), почему бы не рассмотреть возможность использования белого списка вместо этого. Таким образом, каждый символ считается испорченным, если он соответствует.
в этом примере предположим следующее выражение:
RegExp.escape('be || ! be');Это белые списки букв, цифр и пробелов:
RegExp.escape = function (string) { return string.replace(/([^\w\d\s])/gi, '\'); }возвращает:
"be \|\| \! be"Это может экранировать символы, которые не нужно экранировать, но это не мешает вашему выражению (возможно, некоторые незначительные временные штрафы-но это стоит того для безопасности).
функции в других ответах являются излишними для экранирования целых регулярных выражений (они могут быть полезны для экранирования частей регулярных выражений, которые затем объединяются в более крупные регулярные выражения).
если вы экранируете все регулярное выражение и закончите с ним, цитируя метасимволы, которые либо автономны (
.,?,+,*,^,$,|,\) или начать что-то ((,[,{) все вам нужно:String.prototype.regexEscape = function regexEscape() { return this.replace(/[.?+*^$|({[\]/g, '\$&'); };и да, это разочаровывает, что JavaScript не имеет функции, подобной этой встроенной.
Comments