Na forum 4programmers.net korzystamy z plików cookies. Część z nich jest niezbędna do funkcjonowania
naszego forum, natomiast wykorzystanie pozostałych zależy od Twojej dobrowolnej zgody, którą możesz
wyrazić poniżej. Klikając „Zaakceptuj Wszystkie” zgadzasz się na wykorzystywanie przez nas plików cookies
analitycznych oraz reklamowych, jeżeli nie chcesz udzielić nam swojej zgody kliknij „Tylko niezbędne”.
Możesz także wyrazić swoją zgodę odrębnie dla plików cookies analitycznych lub reklamowych. W tym celu
ustaw odpowiednio pola wyboru i kliknij „Zaakceptuj Zaznaczone”. Więcej informacji o technologii cookie
znajduje się w naszej polityce prywatności.
Bo lookahead działa tak że jak jesteś w miejscu X to po prostu patrzy czy następna fraza to 60 nie przesuwając przy tym pozycji, w twoim przypadku następna fraza to 50 czyli działa :D
99xmarcin
Jakbyś miał 606060 to by odrzuciło bo byś miał w lookahead 60.
99xmarcin
Nie wiem czy zrozumiałeś te tłumaczenia więc jeszcze przykład w 606050 regex zacznie maczować (znacznik . - poz w tekscie): 6060.50. 1) lookahead - nie może być 60 - sprawdzmy - przed nami jest 50 więc jest ok. 2) mają być 2 liczby, sprawdźmy - ok mamy przed sobą 50, zjadamy obie liczby i teraz jest 606050. 3) ma być granica słowa, ok jest 4) koniec wyrażenia więc mamy pełny match
Zgadza się, zaproponowany nowy przez Ciebie wzorzec testowałem wcześniej i robi to zrozumiale (efekt jest zgodny z oczekiwanym).
Przedstawione maczowanie nie wyjaśniło mi wyniku, bo powinno być zaznaczone 60 w 405060. Bo ja to rozumuję tak, w uproszczeniu: od granicy na końcu słowa weź 4 znaki, jeśli 2 pierwsze nie są "60" to interesują mnie 2 kolejne (czyli ostatnie). Może jaśniejsze moje rozumowanie jest przy wzorcu: `\b(?!un)\w+\b' np. mówi daj mi wszystkie słowa które nie rozpoczynają się na "un".
Nie będą zaawansowane jak je poznam :) Jak się uda.
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:
Kopiuj
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?
99xmarcin/b
->\b
może to???