2016-04-03 7 views
6

Załóżmy, że szukam linków kotwiczących na stronie internetowej. Wyrażenie, które działa:Moje wyrażenie wyrażenie jest zarówno leniwy i chciwy. Czemu?

"\<a\s+.*?\>" 

Dodajemy jednak komplikację. Załóżmy, że chcę tylko linki otaczające określony tekst, na przykład słowo "następny". Normalnie, to myślę, że wszystko, co musiałem zrobić, to:

"\<a\s+.*?\>next" 

Ale uważam, że teraz, jeśli istnieją 3 znaczniki kotwicy na stronie, a trzeci ma „obok” po nim, że poszukiwania regex znajduje ogromny ciąg znaków rozciągający się od pierwszego znacznika zakotwiczenia i rozciągający się do trzeciego znacznika zakotwiczenia. Ma to sens, jeśli kropka-gwiazdka-questionmark znajduje wszystkie znaki, dopóki nie natknie się na "> następny". Ale tego nie chcę. Chcę znaleźć wszystkie postacie, aż napotka ">", a następnie dodatkowe ograniczenie powinno nastąpić zaraz po ">" powinno być "następne".

Jak to działa?

Odpowiedz

6

można naprawić regex zabraniając go od dopasowania > wewnątrz znacznika, czyli zastępując . z [^>]:

"\<a\s+[^>]*?\>next" 

.*? dopasowuje dowolną liczbę znaków. Fakt, że zrobiłeś to niechętnie, nie zatrzymuje się na >: kontynuuje dopasowywanie przeszłości, dopóki nie znajdzie >next na końcu. To nie jest chciwe, ponieważ wyrażenie pasuje tak mało, jak to możliwe, aby uzyskać dopasowanie. Po prostu nie były dostępne krótsze mecze.

Demo.