Wpis z mikrobloga

#regexp #regex #programowanie

Czy jest tu jakiś spec od regexów?

(?:(?!\1))(\d)\1\b
Dla stringa 888 mam full match 88, ale z tego, co rozumiem, to (?:(?!\1)) powinien eliminować ósemkę na początku i nie dać matcha. Zresztą jak zamieniam \1 na 8, to tak rzeczywiście jest. To ja już nie wiem, jak zrobić, żeby tej pierwszej grupy (w tym przypadku pojedynczej ósemki) nie brał. Rzecz w tym, że to nie muszą być ósemki, tylko dowolne cyfry.

Czyli ma być

888 brak matcha
788 match
444 brak
844 match
  • 5
@zwei: nie pamiętam dokładnej nazwy, ale to ma chyba związek z wyszukiwaniem wstecznym. Normalnie regex jest maszyną stanów, która przetwarza tekst tylko wprzód. Tutaj masz backmatching. Rzucam tylko wskazówkę, powinieneś znaleźć odpowiednią flagę
@zwei: To (?!...) (negative lookahead) działa w odniesieniu do aktualnej pozycji (w twoim przypadku początek), więc to nic nie robi - znaczy match będzie się opierał tylko na powtórzonych ostatnich cyfrach, bo na początku sprawdzasz czy po tym co już dopasowałeś (jeszcze nic) jest coś innego niż to co będzie następne. Dlatego też non-capture nie potrzebny, bo to nie jest nawet dopasowywany ciąg tylko założenie dotyczące tego z czym "sąsiaduje".
(?!(\d)\1)\d\d\b
...jest coś innego niż to co będzie następne.

*jest coś innego niż nic, bo jeszcze tego nie przechwyciłeś.