Я предположил, что проблема заключается в совпадении строки "ab"
или "cd"
при условии, что ей не предшествует строка длиной менее 10 символов "ef"
или "gh"
.
Я должен сделайте предположение о структуре строки: если "ef"
или "gh"
предшествует "ab"
или "cd"
, а последний предшествует "ef"
или "gh"
, за последним не следует "ab"
или "cd"
.
Вот регулярное выражение, которое можно использовать при условии, что движок регулярных выражений поддерживает отрицательных просмотров . Я протестировал его с помощью механизма PCRE.
(?:ef|gh).{0,9}(?:ab|cd)(?!.*(?:ab|cd))|(ab|cd)(?!.*(?:ab|cd))
Демо
Я использовал то, что было названо "величайшим трюком с регулярными выражениями" .
Обратите внимание, что регулярное выражение имеет форму X|(Y)
. Если X
соответствует, группа захвата 1 пуста. Если X
не соответствует, группа захвата 1 будет содержать последний экземпляр в строке строки "ab"
или "cd"
.
X
является выражением, которое, если соответствует, означает, что нет строки "ab"
или "cd"
, которая следует за строкой "cd"
или "ef"
по крайней мере на 10 символов.
Поэтому мы игнорируем то, что соответствует, и исследуем только группу захвата 1. Если она пуста, цель терпит неудачу; если не пусто, цель успешно выполняется, цель состоит в том, чтобы найти последний экземпляр строки "ab"
или "cd"
, которому не предшествует "cd"
или "ef"
или который следует за последний предшествующий "cd"
или "ef"
не менее чем из 10 символов.
Модуль регулярных выражений выполняет следующие операции.
(?:ef|gh) # match 'ef' or 'gh'
.{0,9} # match 0-9 characters
(?:ab|cd) # match 'ab' or 'cd'
(?! # begin a negative lookahead
.* # match 0+ characters
(?:ab|cd) # match 'ab' or 'cd'
) # end negative lookahead
| # or
(ab|cd) # match 'ab' or 'cd'
(?!.*(?:ab|cd)) # match is to not be followed later in the line by 'ab' or 'cd'
отрицательный прогноз, (?!.*(?:ab|cd))
, который появляется дважды, гарантирует, что предыдущее совпадение "ab"
или "cd"
, если оно есть, является последним экземпляром любой строки в строке.
Как обычно, если несколько Строки должны соответствовать небольшим изменениям. Я написал регулярное выражение для сопоставления в строках, чтобы продемонстрировать влияние регулярного выражения для нескольких строк в связанном онлайн-тестере регулярных выражений.