Regexp Java

download Regexp Java

of 5

Transcript of Regexp Java

Wprowadzenie do wyrae regularnych wyraenia regularne (ang. regular expressions, regexp lub regexes)- sposb opisywania tekstu poprzez dopasowywanie wzorcw zastosowanie - bardziej zoone dopasowywanie cigw (np. sprawdzanie poprawnoci dat, zastpowanie jednych fragmentw tekstu innymi, pobieranie fragmentw z wikszych blokw tekstu) 2 style skadni wyrae regularnych: POSIX i Perl w poczeniu z konkretnym narzdziem, w ktrym zostay zaimplementowane, umoliwiaj rnorodne sposoby przetwarzania tekstu.

Wyraenia regularne Java - klasa Matcher i PatternBeata Paczyk

2

Wyraenia regularne - skadnia Znaki zwyczajne a, b, c, z, A, B, C, Z, 0, 1, 2, 9, ,, !, _, ... Znaki specjalne (metaznaki) metaznaki rozpoznawane w dowolnym miejscu wzorca poza nawiasami kwadratowymi [] ^, $, ., *, ?, +, [, ], {, }, (, ), \ metaznaki rozpoznawane w klasach znakw (cz wzorca ujta w nawiasy kwadratowe [], pasujca do dokadnie jednego znaku, bez wzgldu na liczb tworzcych j znakw) ^, -, \, ]3

Elementy wyrae regularnych: dopasowywanie tekstu Wszystkie znaki oprcz znakw specjalnych, okrelaj same siebie, np: k - okrela acuch zoony ze znaku k Kolejne znaki oznaczaj, e znaki te musz wystpi w acuchu dokadnie w takiej samej kolejnoci, np: kot pozwala znale acuch kot w dowolnym miejscu wiersza RegExp oznacza RegExp

4

Elementy wyrae regularnych: znaki specjalne Kropka . oznacza dowolny znak, z wyjtkiem znaku nowego wiersza, np: r.k pasuje do rok, rak, ryk itp. .a. do mak, rak, lat itp. .o.a do lola, cola, wola, kolacja itp.

Elementy wyrae regularnych: znaki specjalne - grupowanie Podwzorzec moe by zamknity w niepodzielnej grupie za pomoc nawiasw ( ). W ten sposb mona uy gazi nie tylko dla caego wzorca, ale rwnie dla jego fragmentw np: Fizy(cy|k) pasuje do Fizycy i Fizyk Zestaw znakw midzy nawiasami kwadratowymi oznacza dowolny znak objty nawiasami kwadratowymi, np: [1234], [1-4] oznacza 1 lub 2 lub 3 lub 4 pi[wk]o pasuje do piwo i piko [a-z] - dopasowywane znaki ograniczamy do zbioru maych liter [aeiouy] - wyliczanie elementw zbioru (samogoski) [a-zA-Z] - wszystkie mae i due litery5 6

rozgazianie [|] oznacza lub, OR i pozwala na czenie wielu wyrae w jedno, do ktrego pasuje dowolne z wyrae skadowych np: (gif)|(jpg) - pasuje do gif lub jpg (U|u)(l|lica) (3-go|Trzeciego) Maja pasuje do ul 3-go Maja, Ul 3-go Maja, ulica 3-go Maja, Ulica 3-go Maja, ul Trzeciego Maja, Ul Trzeciego Maja, ulica Trzeciego Maja, Ulica Trzeciego Maja

1

Kotwiczenie kotwiczenie: ^ - stosowany na pocztku wyraenia regularnego w celu wskazania, e musi si ono pojawi na pocztku szukanego cigu $ - stosowany na kocu wyraenia regularnego, ktre musi si pojawi na kocu szukanego cigu np. kot dopasuje acuch kot w dowolnym miejscu wiersza ^kot pasuje wtedy, gdy mamy pocztek wiersza, po ktrym od razu wystpuje litera k, po niej od razu litera o, a po niej od razu litera t ^kot$ pasuje jeli wiersz zawiera pocztek, po ktrym od razu znajduj si znaki kot, a po nich od razu koniec wiersza ^pawe, gif$, ^[a-z]$ - (pasuje do kadego pojedynczego znaku a-z, jako osobnego cigu7

Zakotwiczenia ^ (daszek) oznacza nie, kiedy jest umieszczony w nawiasach [] [^a-z] - kady znak, ktry nie pochodzi z zakresu a-z Wikszo znakw specjalnych w tym miejscu traci swoje znaczenie, np: [^piwo] pasuje do wszystkich acuchw w ktrych nie wystpujesowo piwo

pi[^wk]o pasuje np. do pinokio, ale wyklucza sowa: piwo oraz piko UWAGA - ze wzgldu na to, e zarwno [-] jak i [^] maj specjalne znaczenie, jeli umieci je w nawiasach kwadratowych, dlatego te chcc dopasowa daszek [^] nie naley umieszcza go na pocztku; chcc dopasowa minus [-] najbezpieczniej umieci go jako ostatni znak w zakresie; dlatego zamiast [^%$#@!], naley zastosowa [%$#@!^], a zamiast [a-c], chcc dopasowa a, c lub naley zastosowa [ac-].8

Reprezentacje znakw \a (alarm x07) \e (ESC x1B) \n (nowy wiersz x0A), \t (tab x09) \r (powrt karetki x0D) \f (wysunicie kartki x0C) \x(szesnastkowa) - znak reprezentowany przez jedno- lub dwucyfrow liczb szesnastkow \x{szesnastkowa} - znak reprezentowany przez dowoln liczb szesnastkow dopasowywanie specjalnych znakw literowych: \ - naley umieci przed znakiem specjalnym np. \\, \}, \$,\.9

Klasy znakw [...] - pojedynczy znak podany lub zawierajcy si w okrelonym zakresie [^...] - pojedynczy znak, ktry nie zosta podany lub nie zawiera si w okrelonym zakresie [[:klasa:]] - klasa znakw POSIX

10

Predefiniowane klasy znakw POSIX [[:alnum:]] - znaki alfanumeryczne [[:alpha:]] - znaki alfabetu [[:lower:]] - mae litery [[:upper:]] - due litery [[:digit:]] - liczby dziesitne [[:xdigit:]] - liczby szesnastkowe [[:punct:]] - znaki przestankowe [[:blank:]] - tabulatory i spacje [[:space:]] - pusta przestrze [[:cntrl:]] - znaki kontrolne [[:print:]] - wszystkie moliwe do wywietlenia znaki [[:graph:]] - wszystkie moliwe do wywietlenia znaki poza spacjami11

Powtarzalno i podwyraenia powtarzalno mona okreli stosujc znaki specjalne: * - wzr moe powtrzy si zero bd wicej razy + - wzr moe powtrzy si jeden bd wicej razy ? - wzr moe wystpi jeden bd zero razy np. [[:alnum:]]+ - co najmniej jeden znak alfanumeryczny ko?t pasuje do kt, kot ko*t pasuje do kt, kot, koot, koooooot, ... ko+t pasuje do kot, koot, koooooot, ... wyraenie mona rozdzieli na podwyraenia stosujc nawiasy jak w zwykych wyraeniach arytmetycznych np. (bardzo)*duo pasuje do 'duo', 'bardzo duo', 'bardzo bardzo duo'12

2

Powtarzalno podwyraenia policzalne - ilo powtrze danego cigu mona okreli stosujc nawiasy klamrowe Wyraenie {X} oznacza dokadnie X wystpie Wyraenie {X,} co najmniej X wystpie, czyli przykadowo {0,} = *, {1,} = + Wyraenie {,X} co najwyej X wystpie Wyraenie {X,Y} oznacza Y dopasowa (jeli to moliwe), ale do powodzenia wystarczy mu ju X, np: {0,1} = ? np.: {3} - dokadnie 3 powtrzenia {2,4} - od dwu do czterech powtrze {2,} - co najmniej dwa powtrzenia np. (bardzo){2,3} - pasuje do 'bardzo bardzo', 'bardzo bardzo bardzo13

Znaki specjalne - zestawienie. ( ) { } dopasowanie do kadego znaku oprcz nowej linii pocztek podcigu koniec podcigu pocztek minimalnego/maksymalnego kwantyfikatora koniec minimalnego/maksymalnego kwantyfikatora

W nawiasach kwadratowych wyrae POSIX stosuje si: \ poprzedza znak specjalny (np. \\b, \\\n) ^ NOT jeli uyte przed wyraeniem - okrelenie zakresu znakw14

Zastosowania Przetwarzanie tekstu: walidacja formularzy poprawianie pomyek masowa zmiana wyrazw w tekcie wyciganie pewnych wyrazw pasujcych do wzorca z tekstu konwertowanie adresw www, generowanych dynamicznie na statyczne i wiele innych operacji zwizanych z tekstem...

Zastosowanie wyrae regularnych sprawdzenie poprawnoci adresu pocztowego postaci: [email protected] za pomoc wyraenia regularnego: ^[a-zA-Z0-9_]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$ znaczenie podwyrae: ^[a-zA-Z0-9_]+ pocztek cigu to przynajmniej jedna litera, cyfra lub _ (albo kombinacja tych znakw @ znak @ [a-zA-Z0-9\-]+ znaki alfanumeryczne i czniki \. znak . [a-zA-Z0-9\-\.]+$ litery, cyfry i czniki oraz ewentualnie wicej kropek, i tak do koca cigu

15

16

Walidacja Walidacja po stronie klienta i po stronie serwera Walidacja formularza po stronie klienta odbywa si w jzyku JavaScript i ma na celu jedynie wygod uytkownika. Zabezpieczenia takie atwo omin. Nie wolno ich traktowa jako rodka gwarantujcego bezpieczestwo serwisu. Wszelkie dane pochodzce od uytkownika, a zatem take dane przekazane za pomoc formularzy, naley traktowa jako potencjalnie niebezpieczne. Pierwszym etapem dziaania skryptu powinna by walidacja wszystkich zmiennych. Walidacja danych w aplikacji internetowej powinna odbywa si w dwch kierunkach: naley dokadnie sprawdzi zarwno wartoci przesane przez klienta do skryptu, jak i zabezpieczy wyniki produkowane przez skrypt17

Typ danych Zmienne przekazywane protokoem HTTP s napisami - adna informacja dotyczca typu danej nie jest doczana do zapytania HTTP - na najniszym poziomie, dane odebrane po stronie serwera s napisami. Bez wzgldu na rodzaj wprowadzonej informacji (liczba cakowita, liczba rzeczywista, warto logiczna, napis), w skrypcie mamy do dyspozycji napis odpowiedniej dugoci, ktry zawiera dane wprowadzone przez uytkownika bd (jak to ma miejsce na przykad w przypadku kontrolki typu radio) wygenerowane przez przegldark przed wysaniem formularza18

3

Walidacja napisw Dugo napisu Dozwolone znaki Niedozwolone znaki Usuwanie kodu HTML Usuwanie biaych znakw Standaryzacja danych: konwersja wielkoci liter

Przykadowe wyraenia regularne www_reg = "^(((f|ht)tpp?s?):\/\/|www\.)[\w\-_]+(\.[\w\-_]+)+([\w\\.,@?^=%&:\/~\+#]*[\w\-\@?^=%&\/~\+#])?"; email_reg = "^(([\w_]+)-*\.?)+@[\w](([\w]+)-?_?\.?)+([a-z]{2,4})$"; http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html imie_reg = "^[a-zA-Z]{2,20}$"; nazwisko_reg = "^[a-zA-Z]{2,40}$"; login_reg = "^[a-zA-Z0-9_-]{3,15}$"; miasto_reg = "^[a-zA-Z\s]{2,50}$"; tel_reg = "^([1-9]{1,1}[0-9]{1,1}(-)?[1-9]{1,1}[0-9]{6,6})|([1-9]{1,1} [0-9]{8,8})$";

19

20

Ciekawe linki Wyraenia Regularne Jeffrey E.F. Friedl http://regexlib.com/ http://www.rexv.org/ http://osteele.com/tools/rework/ http://www.programuj.com/artykuly/www/regularne.php? nolimit=true http://maciek.lasyk.info/regexp_checker.html http://grabun.com/wyrazenia-regularne/ http://www.siteexperts.com/tips/functions/ts23/page1.asp http://www.sweeting.org/mark/html/revalid.php http://www.google.pl/

Wyraenia regularne w javie Klasa Pattern Do obsugi wyrae regularnych su klasy Matcher i Pattern z pakietu java.util.regex Klasa Pattern nie ma konstruktorw a obiekt klasy zwracany jest przez statyczn metod compile(), ktrej argumentem jest cig znakw z wyraeniem regularnym; compile powoduje transformacj wyraenia regularnego do wzorca, np.: Pattern wzorzec = Pattern.compile("wyraenie_regularne"); Metoda matcher() klasy Pattern zwraca obiekt klasy Matcher; argumentem metody jest cig znakw w ktrym bdzie poszukiwany wzorzec, np.: Matcher sekwencja=wzorzec.matcher("cig_do_przeszukania");21 22

Klasa Matcher Nie posiada konstruktorw a do tworzenia obiektu uywa si metody matcher() klasy Pattern Metody: int end() zwraca indeks ostatniego znaku pasujcej sekwencji powikszony o 1 boolean find() zwraca true, jeli znaleziono sekwencj pasujc do wzorca String group() zwraca ostatnio znalezion pasujc sekwencj boolean matches() zwraca true jeli sekwencja(lub jej fragment) pasuje do wzorca; wywoana po raz kolejny szuka kolejnego pasujcego fragmentu String replaceAll(String nowy) - przeszukuje cig znakw i zastpuje w nim pasujce sekwencje nowym cigiem znakw int start() - zwraca indeks pierwszego znaku pasujcej sekwencji23

Przykad 1import java.util.regex.*; public class WyrazeniaRegularne { public static void main(String[] args) { //utworzenie wzorca regex: Pattern wzorzec=Pattern.compile("[ks].+?e"); //utworzenie sekwencji zawierajacej wszystkie podcigi //pasujce do wzorca wyszukane w podanym cigu: Matcher sekwencja= wzorzec.matcher("konie, yrafy, sonie, psy i koty"); //pobranie poszczeglnych podcigw z sekwencji: while (sekwencja.find()) { System.out.println(sekwencja.group()); //wynik: konie sonie } } 24

4

Przykad 2Metoda pomocnicza: public boolean pasuje(String input, String reg) { Pattern wzorzec=Pattern.compile(reg); Matcher sekwencja=wzorzec.matcher(input); return sekwencja.find(); } Wywoanie w serwlecie: String imie=request.getParameter("nazwisko"); imie = new String(imie.getBytes("ISO-8859-1"), "UTF-8"); String ereg="^[a-zA-Z]{2,20}$"; if ((imie!=null) && !(imie.trim().equals("")) && (pasuje(imie,ereg)) ) { out.println("Imi:"+imie+"");} else out.println("Bdne dane");25

5