Как сделать несколько жадных совпадений - PullRequest
0 голосов
/ 05 августа 2009
Source:    <prefix><content1><suffix1><prefix><content2><suffix2>
Engine:    PCRE

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

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

Желаемый результат для RegEx2 - просто , но он явно жадный. Как сделать RegEx2 не жадным и использовать только последний соответствующий вид назад?

[Надеюсь, я правильно перевел это из синтаксиса NoteTab. Я не делаю много RegEx кодирования. Термины , & предназначены только для представления произвольных строк. Только «<» в команде «? <=» Lookbehind имеет значение.] </p>

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

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

Art

Ответы [ 3 ]

2 голосов
/ 05 августа 2009

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

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

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

2 голосов
/ 27 марта 2010

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

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

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

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

1 голос
/ 05 августа 2009

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

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

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

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

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