2016-09-14 7 views
0

Я пытаюсь принять группу захвата только в том случае, если шаблон совпадает, и до конца группы не существует определенного слова. Я попробовал # подходов и никто не похоже на работу, очевидно, я не получаю понятие:Фиксация отрицательного утверждения для конца строки

https://regex101.com/r/iP2xY0/3 https://regex101.com/r/iP2xY0/4

Независимо от того, что я делаю захват группа захватывает что-то и моя цель, если слово отклонения существует в середине шаблона, чтобы вернуть совпадение.

RC:\*.*?(?P<Capture>(Bob|David|Ted|Alice))(?!Reject).* 
  • RC: * Привет Боб Смит < \ человек>
  • RC: * Привет David Jones * Примечания Бла бла < \ человек>
  • RC: * Привет Тед Уоррен * Отклонено < \ человека >

Захват Namegrouop должен вернуться:

  • Боб
  • Дэвид
  • «»

Таким образом, «Отклонить» говорит, что если NameGroup Capture найден следует что-либо заканчивающегося в < захвата его, если между NameGroup и < слово Reject появляется сделать не.

+0

https://regex101.com/r/iP2xY0/5, который соответствует только отклонению –

+0

@be_good_do_good Спасибо. Однако я ищу совпадение 'Bob' в String1,' David' в String2 и ничего в String3. – user3649739

ответ

0

Я бы порекомендовал положить ваш негативный взгляд вперед в начале вашего шаблона. Это сначала проверяет, если ваш отклонять слово существует в строке, и только если оно не есть ли это попытаться соответствовать остальной части строки:

(?!.*Rejected.*)RC:\*.*?(?P<Capture>(Bob|David|Ted|Alice)).*

https://regex101.com/r/iP2xY0/6

+0

Это ведь работает, я думаю, таким образом, «негативный взгляд вперед» :). Я принял ответ, потому что это действительно правильно, но я сталкиваюсь с проблемами, как я использую его с таймаутами. У меня есть две «трубы», первая говорит, что использует группу захвата первого канала, если термин не появляется и использует второй канал, если он делает: https://regex101.com/r/bU6cU6/1, используя ваше решение для neg lookhead для квалификации первой трубы. Однако отрицательная фраза на самом деле составляет около 3 тыс. Символов в тексте, и я получаю тайм-ауты https://regex101.com/r/bU6cU6/2. Есть ли способ обойти это или это просто функция негативного взгляда? – user3649739

+0

Странная вещь в тайм-ауте - это всего лишь 32 шага для регулярного выражения, чтобы узнать, что первый канал не работает сам по себе, и 18 шагов, чтобы узнать, что второй трубок действительно работает сам по себе. Так что не уверен, что Regex делает, что будет время. Не следует ли: а) проверить первую трубу, 32 шага, отклонить, перейти к второй трубе, принять 18 шагов? – user3649739

+1

Поместите взгляд после 'RC:', чтобы уменьшить ненужный возврат. –