2016-09-13 2 views
2

У меня есть строка источника, который выглядит следующим образом: mID00231mID00008mID00231mID00054mID00013mID00008mID00065Matching, если все BCD..n существовать после последнего вхождения

Узор Я пытаюсь создать, используя этот пример, является: Для последнего вхождения из "mID00231" в строке, один или несколько вхождения каждый из {mID00054, mID00013, mID00008, mID00065} должен следовать за ним (в любой заказ).

Примеры матчей:

mID00231mID00008mID00231mID00054mID00013mID00008mID00065 
mID00231mID00013mID00054mID00008mID00065mID00008 

Пример не матча из-за отсутствия «mID00065»:

mID00231mID00054mID00013mID00008 

примере не матча, так как последнее вхождение «mID00231» не сопровождаемый «mID00054» и «mID00008»:

mID00231mID00013mID00065mID00054mID00008mID00231mID00013mID00065 

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

(?:mID00231)(?:(?=.*mID00054)(?=.*mID00013)(?=.*mID00008)(?=.*mID00065).*) 

Он работает, если есть только одно вхождение первого элемента (mID00231). Если элемент повторяется, шаблон не работает. Любая помощь приветствуется.

+0

Когда вы говорите «за которым следует», вы имеете в виду «сразу последовали»? – redneb

+0

Это регулярное выражение 'mID00231 ((? = (? :(?! mID00231).) * MID00054) (? = (? :(? mID00231).) * MID00013) (? = (? :(?! mID00231).) * mID00008) (? = (? :(? mID00231).) * mID00065) (? :(? mID00231).) *) 'выглядит ужасно. Вы уверены, что вам нужно регулярное выражение? –

+0

Хорошо, вы можете заменить закаленные жадные жетоны более простыми взглядами. –

ответ

1

Вы должны провалить матч, если одно и то же значение с отрицательного предпросмотра:

mID00231((?!.*mID00231)(?=.*mID00054)(?=.*mID00013)(?=.*mID00008)(?=.*mID00065).*) 
     ^^^^^^^^^^^^^^ 

См regex demo.

Деталь:

  • mID00231 - соответствовать буквальным mID00231 текста
  • ( - начало группы захвата
    • (?!.*mID00231) - не может быть mID00231 в любом месте после 0+ любых символов, кроме newline
    • (?=.*mID00054) - там должно быть быть mID00054 в любом месте после 0+ любых символов, кроме символа новой строки
    • (?=.*mID00013) - там должен быть mID00013 в любом месте после 0+ любых символов, кроме символа новой строки
    • (?=.*mID00008) - там должен быть mID00008 где-нибудь после того, как 0+ любых символов, но перевод строка
    • (?=.*mID00065) - там должно быть mID00065 в любом месте после 0+ любые символы, но перевод строки
  • .* - 0+ любые символы, но перевод строки
  • ) - конец группы захвата.
Смежные вопросы