2014-12-10 4 views
0

С учетом строки ввода fooxxxxxxfooxxxboo Я пытаюсь написать регулярное выражение, которое соответствует fooxxxboo i.e., начиная со второго foo до последнего boo.Кратчайшая совпадение в регулярном выражении с конца

Я попытался следующие

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

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

Я прочитал это Greedy vs. Reluctant vs. Possessive Quantifiers и я понимаю их разницу, но я стараюсь, чтобы соответствовать кратчайшая строка из конца, которая соответствует регулярному выражению, т. е. что-то вроде регулярного выражения, которое будет оцениваться со спины. Есть ли способ, которым я могу соответствовать только последней части?

ответ

2

Использование negative lookahead assertion.

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

DEMO

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

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

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