Zaczęło mnie zastanawiać jedno, gdy zaproponowałeś poprawiony wzorzec (?<!60)\d{2}\b
to dochodzę do wniosku, że źle stworzyłem wzorzec i zły dobrałem przykład. Chodzi głównie o zasadę wyszukiwania, kolejność we wzorcu. Zaraz wyedytuję i pokaże podsumowanie :)
Ja to widzę tak dla słów:
xy xz yx zx
przy wzorcu: x(?=y)
znajduje x
tylko wtedy gdy po x
jest y
xy xz yx zx
przy wzorcu: x(?!y)
znajduje x
tylko wtedy gdy po x
nie ma y
xy xz yx zx
Błędny wzorzec: (?!y)x
bo to jest to samo co wzorzec: x
i da w efekcie: xy xz yx zx
przy wzorcu: (?<=y)x
znajduje x
tylko wtedy gdy zaraz przed x
jest y
xy xz yx zx
przy wzorcu: (?<!y)x
znajduje x
tylko wtedy gdy przed x
nie ma y
xy xz yx zx
dwa pierwsze x
nie mają y
przed sobą, zatem też pasują do wzorca. Można tu obarczyć prostotę przykładu, ale pokazuje słabości przed którymi trzeba się zabezpieczyć. Ja zakładam, że interesuje mnie koniec słowa i chce osiągnąć taki efekt: xy xz yx zx więc należy:
poprawić wzorzec na: (?<!y)x\b
Błędny wzorzec: x(?!y)
bo to jest to samo co wzorzec: x
i da w efekcie: xy xz yx zx
Czy to wszystko jest przydatne, jak zakładam że warto to znać bo wyrażeniami regularnymi można dużo i szybko osiągnąć (choć mało jeszcze wiem). Tak na szybko szukając zastosowanie dla przewidywania to zamiast wyszukiwać dopasowania ze zbędnym tekstem można użyć wzorca: (?<=href=\").*(?=:)
i wyciągnąć sam rodzaj protokołu <a class="link" href="https://takiadres.pl/</a>
Dodając do aseracji jeszcze alternatywę będzie dopiero można zaszaleć :D Ciekawe czy można połączyć przewidywania z konstrukcją grupowania wstecznego?