Programowanie w Javie – wykład 6 - KULint num1 = Integer.parseInt(snum1); //operacje na num1}...

25
Wyjątki Operacje na napisach cd (klasy StringBuffer, StringBuilder ) Podstawy wyrażeń regularnych Treści prezentowane w wykładzie zostały oparte o: Barteczko, JAVA Programowanie praktyczne od podstaw, PWN, 2014 Barteczko, JAVA Uniwersalne techniki programowania, PWN, 2017 http://docs.oracle.com/javase/8/docs/ C. S. Horstmann, G. Cornell, Java. Podstawy, Helion, Gliwice 2013 Programowanie w Javie – wykład 6

Transcript of Programowanie w Javie – wykład 6 - KULint num1 = Integer.parseInt(snum1); //operacje na num1}...

Page 1: Programowanie w Javie – wykład 6 - KULint num1 = Integer.parseInt(snum1); //operacje na num1} catch (NumberFormatException exc) {//obsługa wyjątku } 7 WYJĄTKI -przykład public

WyjątkiOperacje na napisach cd (klasy StringBuffer, StringBuilder )Podstawy wyrażeń regularnych

Treści prezentowane w wykładzie zostały oparte o:● Barteczko, JAVA Programowanie praktyczne od podstaw, PWN, 2014● Barteczko, JAVA Uniwersalne techniki programowania, PWN, 2017● http://docs.oracle.com/javase/8/docs/● C. S. Horstmann, G. Cornell, Java. Podstawy, Helion, Gliwice 2013

Programowanie w Javie – wykład 6

Page 2: Programowanie w Javie – wykład 6 - KULint num1 = Integer.parseInt(snum1); //operacje na num1} catch (NumberFormatException exc) {//obsługa wyjątku } 7 WYJĄTKI -przykład public

2

WYJĄTKI

Wyjątek - to sygnał o błędzie w trakcie wykonania programu

● Wyjątek powstaje na skutek jakiegoś nieoczekiwanego błędu.

● Wyjątek jest zgłaszany (lub mówiąc inaczej - sygnalizowany).

● Wyjątek jest (może lub musi być) obsługiwany.

Prosty schemat obsługi wyjątków

try { // ... w bloku try ujmujemy instrukcje, //które mogą spowodować wyjątek } catch(TypWyjatku exc) { //w klauzuli catch umieszczamy obsługę wyjątku } catch (TypWyjatku2 exc) {

//obsługa wyjątków TypWyjatku2

} catch (TypWyjatku3 w) {

//obsługa wyjątków TypWyjatku3 } ...

Page 3: Programowanie w Javie – wykład 6 - KULint num1 = Integer.parseInt(snum1); //operacje na num1} catch (NumberFormatException exc) {//obsługa wyjątku } 7 WYJĄTKI -przykład public

3

WYJĄTKI● Wykonywane są kolejne instrukcje bloku try.

● Jeśli w pewnej instrukcji wystąpi błąd (na skutek czego powstanie wyjątek), wykonanie bloku try jest przerywane w miejscu wystąpienia błędu.

● Sterowanie przekazywane jest do pierwszej w kolejności klauzuli catch, w której podana w nawiasach okrągłych po słowie catch klasa wyjątku pasuje do typu powstałego wyjątku. Inne klauzule catch nie są wykonywane.

● Stąd ważny wniosek: najpierw podawać BARDZIEJ SZCZEGÓŁOWE TYPY WYJĄTKÓW np. najpierw FileNotFoundException, a później IOException, bo klasa FileNotFoundException jest pochodna od IOException

● Obsługująca wyjątek klauzula catch może zrobić wiele rzeczy: m.in. zmienić sekwencję sterowania (np. poprzez return lub zgłoszenie nowego wyjątku za pomocą instrukcji throw). Jeśli nie zmienia sekwencji sterowania, to wykonanie programu jest kontynuowane od następnej instrukcji po bloku try.

Page 4: Programowanie w Javie – wykład 6 - KULint num1 = Integer.parseInt(snum1); //operacje na num1} catch (NumberFormatException exc) {//obsługa wyjątku } 7 WYJĄTKI -przykład public

4

WYJĄTKI

PRZYKŁAD. Przypadek braku jawnej obsługi wyjątku dzielenia przez 0

public class NoCatch { public static void main(String[] args) {

int a = 1, b = 0, c = 0;

c = a/b;

System.out.println(c); }}

- powstały błąd (wyjątek) powoduje zakończenie programu, a JVM wypisuje komunikat o jego przyczynie:

Exception in thread "main" java.lang.ArithmeticException: / by zero at NoCatch.main(NoCatch.java:6)

Page 5: Programowanie w Javie – wykład 6 - KULint num1 = Integer.parseInt(snum1); //operacje na num1} catch (NumberFormatException exc) {//obsługa wyjątku } 7 WYJĄTKI -przykład public

5

WYJĄTKIPRZYKŁAD 2. Obsługa wyjątku ArithmeticException - zabezpieczenie się przed możliwymi skutkami całkowitoliczbowego dzielenia przez zero

public class Catch1 { public static void main(String[] args) {

int a = 1, b = 0, c = 0;

String wynik;

try {

c = a/b;//spowoduje powstanie wyjątku

wynik = "" + c;

} catch (ArithmeticException exc) {

wynik = "Dzielenie przez zero"; }

System.out.println(wynik);

}}

Page 6: Programowanie w Javie – wykład 6 - KULint num1 = Integer.parseInt(snum1); //operacje na num1} catch (NumberFormatException exc) {//obsługa wyjątku } 7 WYJĄTKI -przykład public

6

WYJĄTKI

● Typowym przykładem obsługi wyjątków jest weryfikacja wprowadzanych przez użytkownika w oknach dialogowych danych. W omawianych poprzednio przykładowych programach żądaliśmy od użytkownika wprowadzania liczb całkowitych, a następnie za pomocą metody parseInt przekształcaliśmy ich znakową reprezentację na binarną. Jak wiemy, jeśli przy tym wprowadzony napis nie reprezentuje liczby całkowitej, to powstaje wyjątek NumberFormatException. Powinniśmy go zawsze obsługiwać.

● Możemy więc teraz zmodyfikować np. program wykonywania operacji arytmetycznych na liczbach całkowitych:

try {

int num1 = Integer.parseInt(snum1); //operacje na num1 } catch (NumberFormatException exc) {

//obsługa wyjątku }

Page 7: Programowanie w Javie – wykład 6 - KULint num1 = Integer.parseInt(snum1); //operacje na num1} catch (NumberFormatException exc) {//obsługa wyjątku } 7 WYJĄTKI -przykład public

7

WYJĄTKI -przykład

public class CatchTest {

public static Integer pobierzInteger() { String wynik; while((wynik = javax.swing.JOptionPane.showInputDialog( "Podaj liczbę całkowitą"))!=null){ try {

return Integer.parseInt(wynik);//jest liczba

} catch(NumberFormatException exc) {}//błędna wartość //nie robimy nic, powrót do while i ponowna próba pobrania } return null;//Anulowano }

public static void main(String[] args) {

Integer i = pobierzInteger(); if (i == null) System.out.println("Anulowano"); else System.out.println("Podano: " + i); }}

Page 8: Programowanie w Javie – wykład 6 - KULint num1 = Integer.parseInt(snum1); //operacje na num1} catch (NumberFormatException exc) {//obsługa wyjątku } 7 WYJĄTKI -przykład public

8

WYJĄTKI

● Wyjątki są obiektami klas wyjątków.

● Zatem nazwy np. NumberFormatException są nazwami klas, a zmienna exc zawiera referencję do obiektu odpowiedniej klasy wyjątku. Wobec tej zmiennej możemy użyć licznych metod klas wyjątków np.

– getMessage()- zwraca napis - informację o wyjątku

– toString() - zwraca napis - informację o wyjątku (zazwyczaj nazwę klasy + dodatkowe informacje uzyskane przez getMessage())

– printStackTrace()- wypisuje na konsoli informacje o wyjątku oraz sekwencje wywołań metod, które doprowadziły do wyjątku (stos wywołań)

– getCause() - zwraca wyjątek niższego poziomu, który spowodował powstanie wyjątku lub null w przeciwnym razie

Page 9: Programowanie w Javie – wykład 6 - KULint num1 = Integer.parseInt(snum1); //operacje na num1} catch (NumberFormatException exc) {//obsługa wyjątku } 7 WYJĄTKI -przykład public

9

WYJĄTKI

● W Javie zdefiniowanych jest wiele typowych wyjątków (najważniejsze są w pakiecie java.lang). Są one używane przez klasy ze standardowych bibliotek. Różnią się jedynie nazwą, która pozwala zorientować się co dany wyjątek oznacza.

● W swoich aplikacjach można korzystać z tych klas lub zdefiniować nowe, pasujące do konkretnego zastosowania. Wszystkie klasy, których egzemplarze mogą być zgłoszone jako wyjątek muszą dziedziczyć po klasie Throwable.

● Throwable ma dwie bezpośrednie podklasy Error i Exception.

● Wyjątki dziedziczące po Error reprezentują poważne problemy, których aplikacja nie będzie w stanie rozwiązać. Przykładową podklasą jest VirtualMachineError. Wystąpienie takiego wyjątku oznacza, że maszyna wirtualna nie może dalej kontynuować pracy, np. z powodu wyczerpania się zasobów systemowych.

● Wyjątków rozszerzających Error nie należy przechwytywać, gdyż nie ma możliwości zaradzenia sytuacjom wyjątkowym, które je spowodowały.

Page 10: Programowanie w Javie – wykład 6 - KULint num1 = Integer.parseInt(snum1); //operacje na num1} catch (NumberFormatException exc) {//obsługa wyjątku } 7 WYJĄTKI -przykład public

10

WYJĄTKI – Klasa Exception● Wyjątki dziedziczące po Exception reprezentują sytuacje, na które

aplikacja powinna być przygotowana. Jej przykładowe podklasy to:

– IOException, która reprezentuje sytuacje wyjątkowe związane z wejściem/wyjściem,

– ClassNotFoundException, która wskazuje, że maszyna wirtualna nie odnalazła klasy o nazwie podanej jako napis.

● Ciekawą podklasą Exception jest RuntimeException. Wyjątki rozszerzające RuntimeException mogą wystąpić podczas typowych operacji, jak rzutowanie zmiennej, odwołanie się do elementu tablicy lub odwołanie się do składowej obiektu. Ich wystąpienie zazwyczaj oznacza, że programista popełnił błąd w swoim kodzie. JVM wykrywa wystąpienie takich błędów w trakcie działania programu i informuje o tym, zgłaszając odpowiedni wyjątek. Mimo, że takie wyjątki też można obsługiwać, zdecydowanie lepiej jest zadbać, żeby się nie pojawiały. Ze względu na swoją wszechobecność ich pełna obsługa praktycznie mijałaby się z celem.

Page 11: Programowanie w Javie – wykład 6 - KULint num1 = Integer.parseInt(snum1); //operacje na num1} catch (NumberFormatException exc) {//obsługa wyjątku } 7 WYJĄTKI -przykład public

11

WYJĄTKI● Wyjątki pochodne od klas RuntimeException i Error są

niekontrolowane – nie muszą być obsługiwane.

● Pozostałe wyjątki są kontrolowane, co oznacza, że: metody zgłaszają wyjątki wymienione jawnie w swojej klauzuli throws (ew. podklasy tych wyjątków). Wówczas odwołania do tych metod wymagają jawnej obsługi ewentualnie zgłaszanych wyjątków poprzez konstrukcje try – catch lub poprzez wymienienie wyjątku w klauzuli throws naszej metody (tej która odwołuje się do metody, która może zgłosić wyjątek) i "przesunięcie" obsługi wyjątku do miejsca wywołania naszej metody.

● Zatem wiele razy natkniemy się na sytuację, w której musimy obsługiwać wyjątki, które mogą powstać przy wywołaniu jakichś metod ze standardowych klas Javy. Jeśli tego nie zrobimy, kompilator wykaże błąd w programie. Sytuacja taka dotyczy, np. metod ze standardowego pakietu java.io, zawierającego klasy do operowania na strumieniach danych (m.in. plikach).

● Deklaracja throws TypWyj1, TypWyj2,..., TypWyjNużywana w nagłówku metody, konstruktora, oznacza że dana metoda może zgłaszać wyjątki podanych typów:public void metoda() throws InterruptedException{// ciało metody- tu może powstać wyjątek}

Page 12: Programowanie w Javie – wykład 6 - KULint num1 = Integer.parseInt(snum1); //operacje na num1} catch (NumberFormatException exc) {//obsługa wyjątku } 7 WYJĄTKI -przykład public

12

KLAUZULA FINALLYKlauzula finally służy do wykonania kodu niezależnie od tego czy wystąpił wyjątek czy nie.boolean metoda(...) {

try { // instrukcje, które mogą spowodować wyjątek } catch(Exception e) { return false; }

finally {

// posprzątanie, np. zamknięcie pliku } return true; }Jeśli powstał wyjątek - wykonywana jest klauzula catch. Mimo, iż zmienia ona sekwencję sterowania (zwraca false na znak, iż nastąpiło niepowodzenie), sterowanie przekazywane jest do klauzuli finally. I dopiero potem zwracany jest wynik - false. Jeśli nie było wyjątku, po zakończeniu instrukcji w bloku try sterowanie od razu wchodzi do klauzuli finally, a po jej zakończeniu zwracany jest wynik true (wykonywana jest ostatnia instrukcja metody). Dopuszczalna jest forma try bez catch, ale z finally.

Page 13: Programowanie w Javie – wykład 6 - KULint num1 = Integer.parseInt(snum1); //operacje na num1} catch (NumberFormatException exc) {//obsługa wyjątku } 7 WYJĄTKI -przykład public

13

multicatch Wprowadzony w Javie 7 mulitcatch upraszcza obsługę wyjątków. Zamiast:

try { //kod, w którym może powstać jeden z wyjątków //TypExc1, TypExc2}catch (TypExc1 exc){ func();}catch (TypExc2 exc){ func();}

możemy zapisać jedną klauzulę catch dla kilku typów wyjątków

try{ //kod, w którym może powstać jeden z wyjątków //TypExc1, TypExc2}catch (TypExc1 | TypExc2 exc){ func();}

Oczywiście, ma to sens wtedy, gdy obsługa wyjątków TypExc1 , TypExc2 jest taka sama i nie da się jej wyrazić poprzez przechwycenie wyjątku wspólnej nadklasy.

Page 14: Programowanie w Javie – wykład 6 - KULint num1 = Integer.parseInt(snum1); //operacje na num1} catch (NumberFormatException exc) {//obsługa wyjątku } 7 WYJĄTKI -przykład public

14

try-with-resourcesPodobnie, od Javy 7 zamiast pisać:

try { FileInputStream in = new FileInputStream("plik"); try { FileOutputStream out = new FileOutputStream("cel"); //Działanie na "in" i "out" } finally { if(out != null){out.close();} } } finally { if(in!= null){in.close();} }

dla obiektów klas implementujących interfejs AutoCloseable (np. klasy FileInputStream i FileOutputStream), można użyć konstrukcji "try-with-resources":

try (FileInputStream in = new FileInputStream("plik"); FileOutputStream out = new FileOutputStream("cel")) { //Działanie na "in" i "out"}

Page 15: Programowanie w Javie – wykład 6 - KULint num1 = Integer.parseInt(snum1); //operacje na num1} catch (NumberFormatException exc) {//obsługa wyjątku } 7 WYJĄTKI -przykład public

15

WŁASNE WYJĄTKI

Aby stworzyć własny wyjątek należy zdefiniować odpowiednią klasę dziedziczącą po klasie Exception:

class NaszWyj extends Exception {…}

Zwykle w naszej klasie wystarczy umieścić dwa konstruktory: bezparametrowy oraz z jednym argumentem typu String (komunikat o przyczynie powstania wyjątku). W konstruktorach tych należy wywołać konstruktor nadklasy (za pomocą odwołania super(...), w drugim przypadku z argumentem String).

Jeśli jakaś nasza metoda ma sygnalizować wyjątek NaszWyj - musi podać w deklaracji, że może to zrobić:

void naszaMetoda() throws NaszWyj

a następnie sprawdza warunki powstania błędu i jeśli jest błąd - tworzy wyjątek (new NaszWyj(...)) i sygnalizuje go za pomocą instrukcji throw :

throw new NaszWyj(ew_param_konstruktora_z_info_o_błędzie)

Page 16: Programowanie w Javie – wykład 6 - KULint num1 = Integer.parseInt(snum1); //operacje na num1} catch (NumberFormatException exc) {//obsługa wyjątku } 7 WYJĄTKI -przykład public

16

WŁASNE WYJĄTKIclass NaszWyjatek extends Exception { //klasa wyjątku NaszWyjatek() {super();} //konstruktory NaszWyjatek(String s) { super(s); }}

public class NaszaKlasa { … public void metoda() throws NaszWyjatek { … throw new NaszWyjatek("Jakaś przyczyna"); … } …}-------------------------------------------------public class NowyWyjatekTest { public static void main(String[] args) { NaszaKlasa obj = new NaszaKlasa(); try { obj.metoda(); } catch (NaszWyjatek w) { System.out.println(w.getMessage()); //nadklasa Throwable, definiuje metodę getMessage(), //przy pomocy której można wydobyć napis z wyjątku } }}

Page 17: Programowanie w Javie – wykład 6 - KULint num1 = Integer.parseInt(snum1); //operacje na num1} catch (NumberFormatException exc) {//obsługa wyjątku } 7 WYJĄTKI -przykład public

17

StringBuffer, StringBuilder

● Modyfikowalne obiekty-łańcuchy definiują klasy StringBuffer i StringBuilder

● Klasa StringBuilder ma takie same metody jak StringBuffer.

● Rożnica między klasami StringBuffer i StringBuilder polega tylko na tym, że pierwsza zapewnia synchronizację dostępu z równolegle wykonujących się fragmentów kodu (wątków), a wobec tego jest trochę mniej efektywna; jednak ta właściwość jest niezbędna w programowaniu współbieżnym.

● Zastosowanie klasy StringBuffer lub StringBuilder zamiast String jest wskazane przy dużej liczbie połączonych operacji konkatenacji, bo dzięki temu uzyskujemy wielokrotnie wyższą efektywność działania programu. (Przy naprawdę dużej liczbie – powyżej ok. 50 tys.-operacji np. w pętli, użycie klasy String i operatora + jest niezalecane)

Page 18: Programowanie w Javie – wykład 6 - KULint num1 = Integer.parseInt(snum1); //operacje na num1} catch (NumberFormatException exc) {//obsługa wyjątku } 7 WYJĄTKI -przykład public

18

StringBuffer, StringBuilder

Obiekty klasy StringBuffer oraz StringBuilder , to "bufory"-przydzielone fragmenty pamięci, które dynamicznie możemy wypełniać napisami. Łańcuch może też zajmować tylko część bufora. W szczególności możemy utworzyć pusty - na razie - bufor:

StringBuffer sb = new StringBuffer();//StringBuilder sb = new StringBuilder();

po czym wypełniać go zawartością dopisując do niego jakieś kolejne napisy:

sb.append("jakiś napis 1");sb.append(10);sb.append(new Para(1,2));

Metoda append zwraca StringBuffer, wobec tego możemy zapisać krócej

sb.append("jakiś napis 1").append(10).append(new Para(1,2));

Jeśli utworzyłeś już obiekt StringBuffer możesz sprawdzić jego długość metodą length() oraz pojemność metodą capacity().

Nie musisz przejmować się pojemnością bufora, w razie potrzeby zostanie ona automatycznie zwiększona.

Page 19: Programowanie w Javie – wykład 6 - KULint num1 = Integer.parseInt(snum1); //operacje na num1} catch (NumberFormatException exc) {//obsługa wyjątku } 7 WYJĄTKI -przykład public

19

StringBuffer, StringBuilder● Możesz zdefiniować obiekt StringBuffer o zadanej pojemności startowej

StringBuffer tekstBufor = new StringBuffer(50);Domyślnie nowy obiekt StringBuffer mieści 16 znaków.

● Możesz też zmieniać długość obiektu StringBuffer. Jeśli mamyStringBuffer tekstBufor = new StringBuffer("Jakiś tekst");to po poleceniu

tekstBufor.setLength(5);

tekstBufor zawiera "Jakiś". Możemy wrócić do poprzedniej długości obiektu tekstBufor przez

tekstBufor.setLength(ll);

ale zawarty tam tekst już zginął. Nie wolno ustawiać ujemnej długości. Jeśli tak zrobisz zostanie zgłoszony wyjątek StringOutOfBoundsException,

● Obiekt klasy StringBuffer łatwo można przekształcić w obiekt klasy String za pomocą metody toString(): String s = sb.toString();

Page 20: Programowanie w Javie – wykład 6 - KULint num1 = Integer.parseInt(snum1); //operacje na num1} catch (NumberFormatException exc) {//obsługa wyjątku } 7 WYJĄTKI -przykład public

20

StringBuffer, StringBuilder

● Do wstawiania łańcuchów do obiektów StringBuffer służy metoda insert() StringBuffer przyslowie = new StringBuffer("Bez pracy nie ma kołaczy"); przyslowie.insert(4,"dobrej ");wstawi poczynając od indeksu 4 łańcuch "dobrej ". Zatem przyslowie będzie zawierać "Bez dobrej pracy nie ma kołaczy". Ta wersja metody insert dopuszcza jako drugi argument dowolny z typów, które dopuszcza metoda append. Można też wstawiać tablice typu char[].

● StringBuffer zawiera metody charAt() i getChars(), które działają tak jak metody klasy String, Metoda charAt() pobiera znak z zadanej pozycji, a metoda getChars() pobiera ciąg znaków i umieszcza go w tablicy typu char poczynając od zadanej pozycji. Nie ma analogonu metody getBytes() dla obiektów StringBuffer,

● Możesz zmieniać konkretny znak na danej pozycji:przyslowie.setCharAt(2,"z");

● Możesz odwrócić kolejność znaków w łańcuchu:StringBuffer palindrom = new StringBuffer("wspak"); palindrom.reverse();//Wtedy palindrom zawiera "kapsw".

Page 21: Programowanie w Javie – wykład 6 - KULint num1 = Integer.parseInt(snum1); //operacje na num1} catch (NumberFormatException exc) {//obsługa wyjątku } 7 WYJĄTKI -przykład public

21

Wyrażenia regularne

Wyrażenie regularne stanowi opis wspólnych cech (składni) zbioru łańcuchów znakowych.Możemy sobie wyobrażać, że wyrażenie regularne jest pewnym wzorcem, który opisuje jeden lub wiele napisów, pasujących do tego wzorca. Wzorzec taki zapisujemy za pomocą specjalnej składni wyrażeń regularnych.

Najprostszym wzorcem jest po prostu sekwencja znaków, które nie mają specjalnego znaczenia (sekwencja literałów).

Np. wyrażenie regularne abc stanowi wzorzec opisujący trzy występujące po sobie znaki: a, b i c. Wzorzec ten opisuje jeden napis "abc".

We wzorcach możemy stosować znaki specjalne (tzw. metaznaki) oraz tworzone za ich pomocą konstrukcje składniowe. Do znaków specjalnych należą:

$ ^ . * + ? [ ] ( ) { } \

Uwagi: ● jeśli chcemy traktować znaki specjalne jako literały - poprzedzamy je odwrotnym

ukośnikiem \.● w niektórych konstrukcjach składniowych metaznaki tracą specjalne znaczenie i są

traktowane literalnie.

Page 22: Programowanie w Javie – wykład 6 - KULint num1 = Integer.parseInt(snum1); //operacje na num1} catch (NumberFormatException exc) {//obsługa wyjątku } 7 WYJĄTKI -przykład public

22

Wyrażenia regularne- podstawy

Za pomocą znaków specjalnych i tworzonych za ich pomocą bardziej rozbudowanych konstrukcji składniowych opisujemy m.in.

● wystąpienie jednego z wielu znaków - odpowiednie konstrukcje składniowe noszą nazwę klasy znaków (np. litery lub cyfry) : prosta klasa znaków stanowi ciąg znaków ujętych w [] np.[123abc] określa dowolny ze znaków 1,2,3,a,b,c

● zakres znaków (zapisywany z użyciem -), np. [0-9]- dowolna cyfra, [a-zA-Z] - dowolna mała i duża litera alfabetu angielskiego, [a-zA-Z0-9] - dowolna cyfra lub litera

● negacja klasy znaków jeśli pierwszym znakiem jest ^to dopasowanie nastąpi da każdego znaku oprócz wymienionych, np. do wzorca [^abc] będzie pasował każdy znak oprócz a,b,c

● klasy predefiniowane: ➢ . Dowolny znak (w zależności od opcji kompilacji wzorca może pasować lub nie do

znaku końca wiersza)➢ \d Cyfra: [0-9], \D Nie-cyfra: [^0-9]➢ \s "Biały" znak: [ \t\n\x0B\f\r], \S Każdy znak, oprócz "białego": [^\s]➢ \w Jeden ze znaków: [a-zA-Z0-9], znak "dopuszczalny w słowie",

\W Znak nie będący literą lub cyfrą [^\w]➢ \p{Punct} Znak interpunkcji: [! "#$%&'()*+,-./:;<=>?@[\]^_`{|}~]➢ \p{L} Dowolna litera (Unicode)

Ogólna reguła - klasy wprowadzane przez duże litery stanowią negację klas definiowanych przez małe litery.Przykład: wzorzec który dopasowuje teksty składające się z trzech dowolnych cyfr, następujących po nich trzech dowolnych znaków i dwóch znaków, nie będących cyframi: "\d\d\d...\D\D

Page 23: Programowanie w Javie – wykład 6 - KULint num1 = Integer.parseInt(snum1); //operacje na num1} catch (NumberFormatException exc) {//obsługa wyjątku } 7 WYJĄTKI -przykład public

23

Wyrażenia regularne- podstawy

● logiczne kombinacje wyrażeń regularnych, np. a+|b – jedno lub więcej wystąpień znaku a lub znak b;

● powtórzenia – w składni wyrażeń regularnych opisywane przez kwantyfikatory, np. kwantyfikator * oznacza wystąpienie 0 lub więcej razy, a kwantyfikator + wystąpienie co najmniej raz:

• jeśli kwantyfikator następuje po literale, wymagane jest wystąpienie tego literału (liczba wystąpień zależy od kwantyfikatora, w szczególności może być 0), np. "12a+" oznacza 1, potem 2, następnie wystąpienie znaku 'a' jeden lub więcej razy (uwaga:"12a+" nie oznacza wystąpienia ciągu znaków 12a jeden lub więcej razy

• gdy kwantyfikator występuje po klasie znaków – dotyczy dowolnego znaku z tej klasy,np. [abc]+ oznacza wystąpienie jeden lub więcej razy znaku a lub b, lub c

• jeśli kwantyfikator ma dotyczyć dowolnego wyrażenia regularnego X, należy zastosować konstrukcję składniową (X)symbol_kwantyfikatora albo (?:X)symbol_kwantyfikatora.

● Przykład. Wyrażenie regularne a.*z (a, kropka, gwiazdka, z) opisuje dowolną sekwencję znaków, zaczynających się od litery a i kończących się literą z. Do wzorca tego pasują np. następujące napisy: "az", "abz", "a x y z".

● Przykład: (?:12a)+ – jedno lub więcej wystąpień napisu „12a”.

Page 24: Programowanie w Javie – wykład 6 - KULint num1 = Integer.parseInt(snum1); //operacje na num1} catch (NumberFormatException exc) {//obsługa wyjątku } 7 WYJĄTKI -przykład public

24

Wyrażenia regularne- podstawy

Wyrażeń regularnych możemy użyć m.in. do: ● stwierdzenia czy dany napis pasuje do podanego przez wyrażenie wzorca

np. w klasie String mamy metodę public boolean matches(String regex),która sprawdza czy napis pasuje do wzorca

● stwierdzenia czy dany napis zawiera podłańcuch znakowy pasujący do podanego wzorca i ew. uzyskania tego podnapisu i/lub jego pozycji w napisie,

● zamiany części napisu, pasujących do wzorca na inne napisy,● wyróżniania części napisu, które są rozdzielane ciągami znaków pasującymi do

podanego wzorca.

W Javie służą do tego klasy pakietu java.util.regex: Pattern i Matcher.

Przed zastosowaniem wyrażenia regularnego do składniowej analizy jakiegoś napisu musi ono być skompilowane. Obiekty klasy Pattern reprezentują skompilowane wyrażenia regularne, a obiekty te uzyskujemy za pomocą statycznych metod klasy Pattern - compile(...), mających za argument wyrażenie regularne.Obiekty klasy Matcher wykonują operacje wyszukiwania w tekście za pomocą interpretacji skompilowanego wyrażenia regularnego i dopasowywania go do tekstu lub jego części

Page 25: Programowanie w Javie – wykład 6 - KULint num1 = Integer.parseInt(snum1); //operacje na num1} catch (NumberFormatException exc) {//obsługa wyjątku } 7 WYJĄTKI -przykład public

25

Wyrażenia regularne- podstawy

Obiekt-matcher jest zawsze związany z danym wzorcem. Zatem uzyskujemy go od obiektu-wzorca za pomocą metody matcher(...) klasy Pattern, podając jako jej argument przeszukiwany tekst.

Następnie możemy dokonywać różnych operacji przeszukiwania i zastępowania tekstu poprzez użycie różnych metod klasy Matcher.

W szczególności:

● metoda matches() stara się dopasować do wzorca cały podany łańcuch znakowy,

● metoda find() przeszukuje wejściowy łańcuch znakowy i wyszukuje kolejne pasujące do wzorca jego podłańcuchy.

Wszystkie metody dopasowania/wyszukiwania zwracają wartości typu boolean, stwierdzające dopasowanie (true) lub jego brak (false). Więcej informacji o dopasowaniu (jaki konkretnie tekst pasuje do wzorca, gdzie jest jego początek, a gdzie koniec itp.) można uzyskać odpytując matcher o aktualny jego stan za pomocą odpowiednich metod.