Самое короткое совпадение в регулярном выражении с конца

Учитывая входную строку fooxxxxxxfooxxxboo, я пытаюсь написать регулярное выражение, которое соответствует fooxxxboo, т.е. начиная со второго foo до последнего boo.

Я попробовал следующее

foo.*?boo соответствует полной строке fooxxxxxxfooxxxboo

foo.*boo также соответствует полной строке fooxxxxxxfooxxxboo

Я прочитал это Жадные, неохотные и притяжательные квантификаторы и Я понимаю их разницу, но я пытаюсь сопоставить самую короткую строку с конца, которая соответствует регулярному выражению, то есть что-то вроде регулярного выражения, которое нужно оценить сзади. Есть ли способ, которым я могу сопоставить только последнюю часть?


person Srinath    schedule 10.12.2014    source источник


Ответы (2)


Используйте отрицательное предварительное утверждение.

foo(?:(?!foo).)*?boo

ДЕМО

(?:(?!foo).)*? — Нежадное совпадение любого символа, но не foo ноль или более раз. То есть перед сопоставлением каждого символа он проверяет, не является ли символ буквой f, за которой следуют два o. Если да, то будет найден только соответствующий символ.

Почему регулярное выражение foo.*?boo соответствует полной строке fooxxxxxxfooxxxboo?

Поскольку первое foo в вашем регулярном выражении соответствует обеим строкам foo, а следующее .*? будет выполнять нежадное совпадение до строки boo, поэтому мы получили два совпадения fooxxxxxxfooxxxboo и fooxxxboo. Поскольку второе совпадение присутствует внутри первого совпадения, механизм регулярных выражений отображает только первое.

person Avinash Raj    schedule 10.12.2014

.*(foo.*?boo)

Попробуй это. Возьмите захват, т.е. $1 или \1.

Смотрите демо.

https://regex101.com/r/nL5yL3/9

person vks    schedule 10.12.2014
comment
Хорошо для понимания и более эффективно выглядит. - person bobble bubble; 28.05.2018