Если вы знаете точную позицию, будет работать исключение из всех следующих братьев :nth-child()
.
ul li:not(:nth-child(n+3))
Что бы выбрать все li
s до третьего (например, 1-го и 2-го) , Но, по-моему, это выглядит уродливым и очень плотным.
Вы также можете выбрать n-й-правый справа налево:
ul li:nth-child(-n+2)
Что делает то же самое .
Недопустимая функция, связанная выше. Он не может избежать ^
или $
(начало и конец строки) или -
, которые в группе символов используются для диапазонов.
Используйте эту функцию:
RegExp.escape= function(s) {
return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
};
Хотя на первый взгляд может показаться ненужным, экранирование -
(а также ^
) делает функцию, подходящую для экранирования символов, вставляться в класс символов, а также тело регулярного выражения.
Escaping /
делает функцию подходящей для экранирующих символов, которые будут использоваться в литеральном выражении JS для последующего eval.
Поскольку нет недостатка для экранирования любого из них, имеет смысл
И да, неутешительно, что это не является частью стандартного JavaScript.
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"
Это может привести к тому, что символы не должны быть экранированы, но это не мешает вашему выражению (может быть, некоторые незначительные штрафные санкции), но это того стоит ).
Ничто не должно мешать вам просто избегать каждого не буквенно-цифрового символа:
usersString.replace(/(?=\W)/g, '\\');
Вы теряете определенную степень удобочитаемости при выполнении re.toString()
, но вы выигрываете большую простоту (и безопасность) .
Согласно ECMA-262, с одной стороны, регулярные выражения «синтаксические символы» всегда не являются алфавитно-цифровыми, так что результат является безопасным, а специальные escape-последовательности (\d
, \w
, \n
) всегда являются буквенно-цифровыми, так что не будут выдаваться ложные контрольные экраны.
.replace(/[^\w]/g, '\\$&')
будет работать одинаково.
– Tomas Langkaas
10 August 2017 в 07:20
Функции в других ответах являются излишними для экранирования всех регулярных выражений (они могут быть полезны для экранирования частей регулярных выражений, которые позже будут объединены в большие регулярные выражения).
Если вы избегаете всего регулярного выражения и выполняетесь с ним, цитируя метасимволы, которые являются автономными (.
, ?
, +
, *
, ^
, $
, |
, \
) или начать что-то ((
, [
, {
) - это все, что вам нужно:
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
Большинство выражений здесь решают одно конкретные случаи использования.
Это нормально, но я предпочитаю подход «всегда работает».
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
Это более короткая версия.
RegExp.escape = function(s) {
return s.replace(/[$-\/?[-^{|}]/g, '\\$&');
}
Это включает неметаные символы из %
, &
, '
и ,
, но спецификация JavaScript RegExp позволяет это.
.
пропущен. И ()
. Или нет? [-^
странно. Я не помню, что там.
– Qwertiy
22 September 2017 в 20:35
В виджетах автозаполнения 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
escapeRegExp = function(str) {
if (str == null) return '';
return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
};
Существует предложение 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
/
вообще – 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