Регулярное выражение лениво для группы без захвата

У меня есть это регулярное выражение:

(?:(?:AND\sNOT|AND|OR)(?!.*(?:AND\sNOT|AND|OR))\s)(.*)

Я хочу получить последнюю пару ключ: значение, например -

k:v AND k1:v1 AND NOT k2:v2 OR k3:v3

Я хочу, чтобы регулярное выражение соответствовало k3:v3, и оно соответствует, но оно не соответствует ключу:значение в следующей ситуации -

k:v

Мне нужно, чтобы он соответствовал паре ключ: значение, даже если он первый и до этого не было операторов...

update: ключ: значение здесь не проблема, мне нужно, чтобы оно соответствовало всему после последнего оператора

обновление 2: попытался сделать следующее -

(?:(?:AND\sNOT|AND|OR)?(?!.*(?:AND\sNOT|AND|OR))\s)(.*)
(?:(?:AND\sNOT|AND|OR?)(?!.*(?:AND\sNOT|AND|OR))\s)(.*)

не работал


person Nadav Shabtai    schedule 25.02.2018    source источник
comment
Возможно, (?:.*(?:AND\sNOT|AND|OR)\s)?(.*)$   -  person Srdjan M.    schedule 25.02.2018
comment
Можете ли вы опубликовать свой комментарий в качестве ответа, чтобы я мог проголосовать за него?   -  person Nadav Shabtai    schedule 25.02.2018
comment
Добавлено и обновлено регулярное выражение!   -  person Srdjan M.    schedule 25.02.2018


Ответы (3)


Изменить. Плохо, \K не поддерживается в JS. Вот альтернативный вариант:

/(?:.*(?:AND|OR|NOT)\s+)?(.*)/ (группа 1)

https://regex101.com/r/AyVV89/3 (пожалуйста, проверьте соответствие на правая панель, почему-то группа 1 не выделена в тексте.)

Исходное сообщение

Согласно вашему последнему обновлению (это было совершенно не очевидно, прежде чем вы упомянули об этом):

ключ: значение здесь не проблема, мне нужно, чтобы оно соответствовало всему после последнего оператора

Этот будет соответствовать чему угодно после последнего оператора, независимо от того, что это такое (и работать без оператора тоже):

/(?:.*(?:AND|OR|NOT)\s+\K)?.*/

https://regex101.com/r/AyVV89/2

person Jeto    schedule 25.02.2018
comment
Javascript не поддерживает \K. - person revo; 25.02.2018
comment
Вы правы, не понял этого. Тогда отредактирую/удалю мой ответ, спасибо. - person Jeto; 25.02.2018

Обновить

Согласно комментариям, я предполагаю, что вам нужно сопоставить последнюю пару ключ: значение вместе с ее оператором, если таковой имеется, и всем, что следует после:

(?:.*\b(AND(?:\sNOT)?|OR) +)?(\S+:\S+.*)

Демо


То, что вам нужно, может быть упрощено до этого:

(?:AND(?:\sNOT)?|OR)\s+(\S+)$

Текущая демонстрация

  • (?:AND(?:\sNOT)?|OR) соответствует AND или AND NOT или OR
  • \s+ соответствует любому количеству пробелов
  • (\S+) сопоставлять и захватывать символы без пробелов
  • $ утверждает конец строки
person revo    schedule 25.02.2018
comment
Ваше регулярное выражение не работает должным образом: regex101.com/r/JXXjWk/2 - person Nadav Shabtai; 25.02.2018
comment
Вы ищете \S+$? Посмотрите на эту демонстрацию. - person revo; 25.02.2018
comment
Нет, ваше регулярное выражение не включает событие пробела, если оно не является оператором между ними.. еще раз посмотрите на мой вопрос.. в любом случае С.Джован опубликовал правильное регулярное выражение - person Nadav Shabtai; 25.02.2018
comment
regex101.com/r/yniN74/2 соответствует последнему слову, а не всему после оператора ... Мне нужно, чтобы операторы были разделителем, а не пробелами - person Nadav Shabtai; 25.02.2018
comment
Итак, вам нужно все после последней пары ключ: значение? здесь asd asd? - person revo; 25.02.2018
comment
regex101.com/r/jAeS6o/5 Теперь он не группирует значения, он выбирает операторы слишком - person Nadav Shabtai; 25.02.2018

Судя по вашему объяснению, вам вообще не нужен первый оператор. Просто попробуйте

(?!.*(?:NOT|AND|OR)\s)(\b.*)
person AndreyS Scherbakov    schedule 25.02.2018
comment
ваше регулярное выражение недействительно - person Nadav Shabtai; 25.02.2018