Есть ли регулярное выражение.функция escape в Javascript?



Я просто хочу создать регулярное выражение из любой возможной строки.



var usersString = "Hello?!*`~World()[]";
var expression = new RegExp(RegExp.escape(usersString))
var matches = "Hello".match(expression);


есть ли встроенный метод для этого? Если нет, то что люди используют? У Руби есть RegExp.escape. Я не чувствую, что мне нужно писать свой собственный, там должно быть что-то стандартное. Спасибо!

717   12  

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

    Ничего не найдено.