Я нашел способ сфокусировать всех предыдущих братьев и сестер (напротив ~
), которые могут работать в зависимости от того, что вам нужно.
Допустим, у вас есть список ссылок и при падении на одном, все предыдущие должны стать красными. Вы можете сделать это следующим образом:
/* default link color is blue */
.parent a {
color: blue;
}
/* prev siblings should be red */
.parent:hover a {
color: red;
}
.parent a:hover,
.parent a:hover ~ a {
color: blue;
}
<div class="parent">
<a href="#">link</a>
<a href="#">link</a>
<a href="#">link</a>
<a href="#">link</a>
<a href="#">link</a>
</div>
Недопустимая функция, связанная выше. Он не может избежать ^
или $
(начало и конец строки) или -
, которые в группе символов используются для диапазонов.
Используйте эту функцию:
RegExp.escape= function(s) {
return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
};
Хотя на первый взгляд может показаться ненужным, экранирование -
(а также ^
) делает функцию, подходящую для экранирования символов, вставляться в класс символов, а также тело регулярного выражения.
Escaping /
делает функцию подходящей для экранирующих символов, которые будут использоваться в литеральном выражении JS для последующего eval.
Поскольку нет недостатка для экранирования любого из них, имеет смысл
И да, неутешительно, что это не является частью стандартного JavaScript.
Ничто не должно мешать вам просто избегать каждого не буквенно-цифрового символа:
usersString.replace(/(?=\W)/g, '\\');
Вы теряете определенную степень удобочитаемости при выполнении re.toString()
, но вы выигрываете большую простоту (и безопасность) .
Согласно ECMA-262, с одной стороны, регулярные выражения «синтаксические символы» всегда не являются алфавитно-цифровыми, так что результат является безопасным, а специальные escape-последовательности (\d
, \w
, \n
) всегда являются буквенно-цифровыми, так что не будут выдаваться ложные контрольные экраны.
.replace(/[^\w]/g, '\\$&')
будет работать одинаково.
– Tomas Langkaas
10 August 2017 в 07:20
Большинство выражений здесь решают одно конкретные случаи использования.
Это нормально, но я предпочитаю подход «всегда работает».
function regExpEscape(literal_string) {
return literal_string.replace(/[-[\]{}()*+!<=:?.\/\\^$|#\s,]/g, '\\$&');
}
Это «полностью исчезнет», буквальная строка для любого из следующих применений в регулярных выражениях:
new RegExp(regExpEscape(str))
new RegExp('[' + regExpEscape(str) + ']')
new RegExp('x{1,' + regExpEscape(str) + '}')
Описанные специальные символы:
-
: создает диапазон символов в классе символов. [
/ ]
: Запускает / завершает класс символов. {
/ }
: Запускает / завершает спецификатор нумерации . (
/ )
: Запускает / завершает группу. *
/ +
/ ?
: Определяет тип повторения. .
: соответствует любому символу. \
: стирает символы и запускает объекты. ^
: указывает начало зоны соответствия и отменяет соответствие в символьный класс. $
: Задает конец зоны совпадения. |
: Определяет чередование. #
: указывает комментарий на свободном расстоянии \s
: Игнорируется в режиме свободного пробела. ,
: Разделяет значения в спецификаторе нумерации. /
: Запускает или завершает выражение. :
: Завершает специальные типы групп и часть классов символов в стиле Perl. [/ g 20] !
: Отклоняет группу нулевой ширины. <
/ =
: Часть спецификаций группы нулевой ширины. Примечания :
/
не является строго необходимым в любом вкусе регулярного выражения. Тем не менее, он защищает, если кто-то (содрогание) делает eval("/" + pattern + "/");
. ,
гарантирует, что если строка должна быть целым числом в числовом спецификаторе, она будет должным образом вызывают ошибку компиляции RegExp вместо того, чтобы молча выполнять компиляцию. #
и \s
не нужно бежать в JavaScript, но делать это во многих других вариантах. Они ускользнуты здесь, если регулярное выражение будет передано в другую программу. Если вам также необходимо будущее регулярное выражение против возможных дополнений к движку JavaScript regex возможности, я рекомендую использовать более параноид:
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) : '') + ')');
Для тех, кто использует lodash, , так как v3.0.0 , функция _. escapeRegExp встроена:
_.escapeRegExp('[lodash](https://lodash.com/)');
// → '\[lodash\]\(https:\/\/lodash\.com\/\)'
И, в событие, которое вы не хотите требовать полной библиотеки lodash, вы можете потребовать только эту функцию !
escapeRegExp
.
– gustavohenke
31 August 2017 в 13:24
В виджетах автозаполнения jQueryUI (версия 1.9.1) они используют несколько другое регулярное выражение (строка 6753), вот регулярное выражение, объединенное с подходом @bobince.
RegExp.escape = function( value ) {
return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
}
,
(что не является метасимволом) и #
и пробелами, которые имеют значение только в режиме свободного пробела (который не поддерживается JavaScript). Тем не менее, они правильно понимают, что не сбежать от косой черты.
– Martin Ender
8 July 2013 в 11:22
$.ui.autocomplete.escapeRegex(myString)
.
– Scott Stafford
19 August 2013 в 19:37
Существует предложение ES7 для RegExp.escape в https://github.com/benjamingr/RexExp.escape/ , с полиполем, доступным в https://github.com /ljharb/regexp.escape.
Руководство разработчика Mozilla Developer Network для регулярных выражений предоставляет эту функцию экранирования:
function escapeRegExp(string){
return string.replace(/([.*+?^${}()|\[\]\/\\])/g, "\\$1");
}
=
? AFAIK, это было бы полезно для регулярных выражений Perl (?=
), но если вы избежите ?
, вам будет хорошо идти.
– Dan Dascalescu
2 August 2014 в 01:51
=
больше не включена.
– user113215
7 August 2014 в 17:31
XRegExp имеет функцию escape:
XRegExp.escape('Escaped? <.>');
// -> 'Escaped\?\ <\.>'
Подробнее: http://xregexp.com/api/#escape
Вместо того, чтобы избегать символов, которые могут вызвать проблемы в вашем регулярном выражении (например, черный список), почему бы вам не использовать вместо этого белый список. Таким образом, каждый символ считается испорченным, если он не соответствует.
В этом примере предположим следующее выражение:
RegExp.escape('be || ! be');
Это белый список букв, цифр и пробелов:
RegExp.escape = function (string) {
return string.replace(/([^\w\d\s])/gi, '\\$1');
}
Возвраты:
"be \|\| \! be"
Это может привести к тому, что символы не должны быть экранированы, но это не мешает вашему выражению (может быть, некоторые незначительные штрафные санкции), но это того стоит ).
Функции в других ответах являются излишними для экранирования всех регулярных выражений (они могут быть полезны для экранирования частей регулярных выражений, которые позже будут объединены в большие регулярные выражения).
Если вы избегаете всего регулярного выражения и выполняетесь с ним, цитируя метасимволы, которые являются автономными (.
, ?
, +
, *
, ^
, $
, |
, \
) или начать что-то ((
, [
, {
) - это все, что вам нужно:
String.prototype.regexEscape = function regexEscape() {
return this.replace(/[.?+*^$|({[\\]/g, '\\$&');
};
И да, неутешительно, что JavaScript не имеет такой функции, как эта встроенная -в.
(text)next
и вставляете его в: (?:
+ ввод + )
. Ваш метод даст результирующую строку (?:\(text)next)
, которая не скомпилируется. Обратите внимание, что это довольно разумная вставка, а не какой-то сумасшедший, такой как re\
+ input + re
(в этом случае программиста можно обвинять в том, что он делает что-то глупое)
– nhahtdh
27 November 2014 в 03:58
\
должно быть экранировано, так как ваше регулярное выражение оставит \w
неповрежденным. Кроме того, JavaScript, похоже, не позволяет останавливать )
, по крайней мере, это то, что Firefox вызывает ошибку.
– nhahtdh
28 November 2014 в 02:30
Это более короткая версия.
RegExp.escape = function(s) {
return s.replace(/[$-\/?[-^{|}]/g, '\\$&');
}
Это включает неметаные символы из %
, &
, '
и ,
, но спецификация JavaScript RegExp позволяет это.
.
пропущен. И ()
. Или нет? [-^
странно. Я не помню, что там.
– Qwertiy
22 September 2017 в 20:35
escapeRegExp = function(str) {
if (str == null) return '';
return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
};
/
вообще – thorn 14 February 2013 в 22:53quotemeta
(\Q
), Pythonre.escape
, PHPpreg_quote
, RubyRegexp.quote
... – bobince 3 October 2013 в 11:24var e = /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g;
, а затем ваша функцияreturn s.replace(e, '\\$&');
Таким образом вы только создадите экземпляр RegExp один раз. – styfle 17 October 2013 в 22:14RegExp.escape
, чья реализация отличается от вашей? Не лучше ли, чтобы эта функция не была привязана ни к чему? – Mark Amery 23 February 2015 в 18:16