Wyrażenia regularnie
Wracając to rzeczy
Czym są wyrażenia regularne?
Wyrażenia regularne służą do przetwarzania tekstów, piszemy wzorzec wg którego będą znajdowane wyniki w teksie a następnie (jeżeli chcemy) zostanie zmieniony.
Wyrażenia regularne na angielski to Regular Expresions skrótowo regexp
Jest w tym haczyk?
Jak to wygląda
Wzorce będę umieszczał w ukośnikach “/…/”
Zestaw którym musimy opisać wzorzec nie jest olbrzymi ale wystarczy aby stworzyć prawie każdy wzorzec.
- * - Poprzedzającego znaku ma być 0 lub więcej razy.
- + - Poprzedzającego znaku ma być 1 lub więcej razy.
- ? - Poprzedzający znak jest opcjonalny.
- | - Alternacja (wzorzec LUB inny_wzorzec).
- . - (kropka) Zastępuje dowolny znak.
- ^ - Początek wiersza.
- $ - Koniec wiersza.
- () - Grupują symbole.
- [] - Klasa znaków.
—
Znaki specjalne występujące w Perlu
- \d - Dowolna cyfra (JEDNA!)
- \D - Wszystko inne niż cyfra
- \s - Znaki ‘białe’
- \S - Wszystko inne niż znaki białe
- \w - Dowolna litera
- \W - Wszystko inne niż litera
- \b - Granica słowa
$1..$9 - Odwołania wsteczne, do tych zmiennych zostają wprowadzone dopasowania z nawiasów.
Napiszmy wyrażenia regularne
Jest podany wyraz 6 literowy z literkami t**a**.
Więc nasz regexp będzie wyglądał tak: /^t..a..$/
A polecenie w konsoli tak : grep “^t..a..$” /usr/share/dict/american
Ten regexp nie jest skomplikowany, może dziwić obecność ‘^’ oraz ‘$’, a usuń je… i zobaczysz, że słów jest więcej, ponieważ grep zaczął szukać wzorca również w wyrazach NIE zaczynających się od ‘t’.
Kolejny przykład:
Miałem problem, ponieważ pisałem często słowo ’super’ z dwoma lub więcej ‘r’. Chcąc się ich pozmyć uruchomiłem w ‘Kate’ opcję ‘znajdź i zastąp’ wpisując odpowiedniego regexpa:
/super+/ zastąp na ’super’. I tyle.
Ten przykład jest ściągnięty z książki którą na samym początku wymieniłem.
posiadamy w zmiennej $cena, cenę pewnego produktu, chcemy aby była zwracana w postaci dwóch miejsc po przecinku, ale gdy trzecią cyfrą po przecinku jest cyfra inna niż zero, wtedy ma być zwrócona.
Przykład: 37.500 -> 37.50, 12.3753821 -> 12.375
Polecenie wyglądać będzie tak $cena =~ s/(\.\d\d[1-9]?)\d*/$1/
Zagmatwane?…
Funkcja s/…/…/ wygląda i działa jak sed
‘\.’ mówi nam że w tym miejscu ma być kropka na NIE znak określający dowolny znak
‘\d\d’ mówi mam że mają być dwie cyfry z zakresu [0-9]
‘[1-9]?’ następnie jest cyfra zakresu 1-9 która jest opcjonalne, nie musi jej być
‘\d*’ oznacza resztę cyfr których może być od 0 do nieskoczości
‘$1′ mówi nam, że do zmienej $cena ma zwrócić zawartość nawiasów.
