Как не жадно искать совпадения с несколькими поисковыми запросами

Source:    <prefix><content1><suffix1><prefix><content2><suffix2>
Engine:    PCRE

RegEx1:    (?<=<prefix>)(.*)(?=<suffix1>)
RegEx2:    (?<=<prefix>)(.*)(?=<suffix2>)

Result1:   <content1>
Result2:   <content1><suffix1><prefix><content2>

Желаемый результат для RegEx2 — просто ‹content2›, но он явно жадный. Как сделать RegEx2 не жадным и использовать только последний поиск назад?

[Надеюсь, я правильно перевел это из синтаксиса NoteTab. Я не делаю много кодирования RegEx. Термины ‹prefix›, ‹content› и ‹suffix› предназначены только для представления произвольных строк. Имеет значение только «‹» в команде «?‹=" lookbehind.]

Я подозреваю, что это что-то простое, но после слишком многих часов поиска я отказываюсь от решения этого сам.

Спасибо за помощь

Искусство


person Community    schedule 05.08.2009    source источник


Ответы (3)


Я предлагаю вам использовать:

(?<=<prefix>)(((?!<prefix>).)*)(?=<suffix2>)

Это гарантирует, что внутри совпадения не может быть <prefix>. Полный результат матча будет <content2>

person Tim Pietzcker    schedule 05.08.2009

Поставить перед ним что-нибудь жадное?

(?:.*)(?<=<prefix>)(.*)(?=<suffix2>)

Поскольку жадный (?:.*) сожрет столько, сколько сможет, остальная часть шаблона будет соответствовать только минимуму, что фактически сделает остальные нежадными.

Нежадный .*? также может работать:

(?<=<prefix>)(.*?)(?=<suffix2>)
person Amber    schedule 05.08.2009
comment
Первое регулярное выражение выглядит нормально (конечно, тогда вам нужно будет использовать \1, а не все совпадение), второе не будет работать. Это все равно будет слишком много совпадений (поскольку первое возможное совпадение побеждает, а длинное совпадение все еще возможно). - person Tim Pietzcker; 05.08.2009
comment
Да, я не был уверен насчет второго, поэтому мог бы. - person Amber; 05.08.2009
comment
Спасибо, Дав. Я попробую, но я надеялся, что в RegEx есть что-то более элегантное, например, какой-то относительный идентификатор, похожий на номера подшаблонов. - person ; 05.08.2009

У меня была такая же проблема. Но в моем случае это было

(?<=<prefix>)(?:.(?!<prefix>))*(?=<suffix>)

Это сделало то, что я хотел.

Это выражение будет соответствовать всему, что представляет собой конкатенацию символов между <prefix> и <suffix> и не содержит подстроку <prefix>. (Я так думаю. Я не очень хорошо разбираюсь в регулярных выражениях.)

person 5gon12eder    schedule 27.03.2010