Programowanie w środowisku graficznym- wykład 4 Wyjątki Operacje na napisach (klasy String, StringTokenizer, StringBuffer, StringBuilder )

Podobne dokumenty
Programowanie w Javie wykład 6

JAVA- wykład 4 Wyjątki Operacje na napisach (klasy String, StringTokenizer, StringBuffer, StringBuilder )

Apilkacje w środowisku Java- wykład 4

Programowanie w Javie wykład 5

Tablice i łańcuchy znakowe jako obiektowe typy danych. dr Jarosław Skaruz

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Wykład 8: Obsługa Wyjątków

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Języki i metody programowania Java INF302W Wykład 3 (część 1)

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Podstawy i języki programowania

Dawid Gierszewski Adam Hanasko

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Obsługa błędów za pomocą wyjątków. Paweł Motofa (140746)

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Throwable. Wyjatek_1(int x_) { x = x_; } int podaj_x()

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Zofia Kruczkiewicz, Programowanie obiektowe - java, wykład 2 1

Stałe oznaczane są słowem kluczowym final. Do stałej wartość można przypisać tylko raz. Dobrą konwencją jest nazywanie stałych wielkimi literami

Podstawy i języki programowania

WYJĄTKI. Jest ona jednak czasochłonna i prowadzi do duŝego zapotrzebowania na zasoby systemu.

Aplikacje w Javie- wykład 11 Wątki-podstawy

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Dokumentacja do API Javy.

Programowanie w języku Java

Podstawy programowania skrót z wykładów:

JAVA W SUPER EXPRESOWEJ PIGUŁCE

MATERIAŁY POMOCNICZE DO ĆWICZENIA 3 Klasy i obiekty; atrybuty i metody

Programowanie obiektowe

Programowanie obiektowe

Rozdział 4 KLASY, OBIEKTY, METODY

Podstawowe części projektu w Javie

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

1 Podstawy c++ w pigułce.

Wyjątki Monika Wrzosek (IM UG) Programowanie obiektowe 180 / 196

Przedstawię teraz tzw. podstawowe symbole wyrażenia regularne (BRE, Basic Regular Expression)

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Wykład 8: klasy cz. 4

Podstawy i języki programowania

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Wprowadzanie danych: klasa Scanner

Programowanie obiektowe

Szablony klas, zastosowanie szablonów w programach

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Wykład 2: Podstawy Języka

Wyjątki (exceptions)

2. Tablice. Tablice jednowymiarowe - wektory. Algorytmy i Struktury Danych

dziedziczenie - po nazwie klasy wystąpią słowa: extends nazwa_superklasy

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Programowanie 2 - Tablice i łańcuchy

Powtórka algorytmów. Wprowadzenie do języka Java.

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Programowanie w Internecie. Java

Zad.30. Czy można utworzyć klasę, która implementuje oba interfejsy?

Programowanie obiektowe

Delphi Laboratorium 3

Programowanie Obiektowe Ćwiczenie 4

Języki i metody programowania Java. Wykład 2 (część 2)

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Metody Metody, parametry, zwracanie wartości

Wprowadzanie danych z klawiatury. Wyjątki związane z wprowadzaniem danych, przekroczeniem rozmiaru tablicy, dzieleniem przez zero itd.

Platformy Programistyczne Podstawy języka Java

1 Powtórzenie wiadomości

JAVA. Platforma JSE: Środowiska programistyczne dla języka Java. Wstęp do programowania w języku obiektowym. Opracował: Andrzej Nowak

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Wprowadzenie do języka Java

Programowanie - instrukcje sterujące

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Zmienne, stałe i operatory

Programowanie obiektowe zastosowanie języka Java SE

SQL, LIKE, IN, CASE, EXISTS. Marcin Orchel

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Języki i metody programowania Java INF302W Wykład 2 (część 1)

Skanowanie OCR w aplikacji Kancelaria Komornika. Instrukcja dla użytkownika

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

Podejście obiektowe. Tablice obiektów Przykład 1 metody i atrybuty statyczne oraz niestatyczne

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Java EE produkcja oprogramowania

Wykład 7: Pakiety i Interfejsy

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Język C++ wykład VIII

C++ Przeładowanie operatorów i wzorce w klasach

Część 4 życie programu

lekcja 8a Gry komputerowe MasterMind

Wykład 3 Składnia języka C# (cz. 2)

KOTLIN. Język programowania dla Androida

Powtórka algorytmów. Wprowadzenie do języka Java.

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

MATERIAŁY POMOCNICZE DO ĆWICZENIA 1 Aplikacja w języku Java. Pakiety i biblioteki Javy. Kompilacja i wykonanie programu Javy

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Operatory cd. Relacyjne: ==!= < > <= >= bool b; int i =10, j =20; dzielenie całkowitych wynik jest całkowity! Łączenie tekstu: + string s = "Ala ma ";

Podstawy programowania. Podstawy C# Tablice

Wykład 2 Składnia języka C# (cz. 1)

Wykład 4: Klasy i Metody

Transkrypt:

Programowanie w środowisku graficznym- wykład 4 Wyjątki Operacje na napisach (klasy String, StringTokenizer, StringBuffer, StringBuilder ) 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

WYJĄTKI 2 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...

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. 3

WYJĄTKI 4 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)

WYJĄTKI PRZYKŁ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); 5

WYJĄTKI 6 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

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); 7

WYJĄTKI 8 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

WYJĄTKI 9 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.

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.

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,..., TypWyjN uż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 11

12 KLAUZULA FINALLY Klauzula 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.

multicatch 13 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.

try-with-resources 14 Podobnie, 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-withresources": try (FileInputStream in = new FileInputStream("plik"); FileOutputStream out = new FileOutputStream("cel")) { //Działanie na "in" i "out"

WŁASNE WYJĄTKI 15 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)

WŁASNE WYJĄTKI class 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 16

17 Klasa String W klasie String znajdziemy wiele użytecznych metod przeznaczonych do operowania na łańcuchach znakowych. Kolejne znaki napisów występują na pozycjach, które są indeksowane od 0. Części napisów (łańcuchów znakowych) określa się terminem "podłańcuch" (substring). Obiekty klasy String są niemodyfikowalne (ang. immutable) - to znaczy napisów klasy String nie możemy zmieniać (np. do napisu dodać inny). W wielokrotnie używanej przez nas konkatenacji łańcuchów wynikowy napis, powstający z dodania do łańcucha znakowego innego napisu, jest nowym obiektem i np. w takiej sekwencji: String s = "Ala"; s = s + " ma kota"; tworzony jest nowy obiekt, zawierający napis "Ala ma kota" i referencja do niego przypisywana jest zmiennej s, która poprzednio zawierała referencję do napisu "Ala". Zwróćmy też uwagę, że w klasie String nie ma żadnych metod pozwalających modyfikować istniejący obiekt-napis.

Klasa String -wybrane metody 18 Poniżej przedstawimy kilka wybranych metod. Większość metod (wszystkie metody niestatyczne) używana jest "na rzecz" obiektów klasy String; o obiekcie na rzecz którego wywołano metodę mówimy ten napis. String(char[] c) konstruktor, tworzy napis z tablicy znaków char data[] = {'a', 'b', 'c'; String str = new String(data); String(byte[] b) konstruktor, tworzy napis z tablicy bajtów (używana jest domyślna strona kodowa do przekształcania bajtów na znaki) char charat(int index) - zwraca znak na pozycji, oznaczonej indeksem index. Pierwsza pozycja ma indeks 0. int compareto(string anotherstring) - porównuje dwa napisy: ten (this) na rzecz którego użyto metody oraz przekazany jako argument. Metoda zwraca 0, gdy napisy są takie same. Jeżeli się różnią, to - gdy występują w nich różne znaki - zwracana jest wartość: this.charat(k) - anotherstring.charat(k), gdzie k - indeks pierwszej pozycji, na której występuje różnica znaków. Jeżeli długość napisów jest różna (a znaki napisów są takie same w części określanej przez długość krótszego napisu) - zwracana jest różnica długości: this.length() - anotherstring.length(). Oznacza to, że wynik jest ujemny, gdy ten (this) łańcuch poprzedza leksykograficznie (alfabetycznie) argument (anotherstring) oraz dodatni - gdy ten łańcuch jest leksykograficznie większy od argumentu.

19 Klasa String -wybrane metody int comparetoignorecase(string str) - porównuje leksykograficznie dwa napisy, bez rozróżnienia małych i wielkich liter. boolean endswith(string suffix) - zwraca true, gdy napis kończy się łańcuchem znakowym podanym jako argument, false - w przeciwnym razie. boolean equals(object anobject) - zwraca true, gdy anobject jest takim samym co do zawartości napisem jak ten napis; w każdym innym przypadku - zwraca false. boolean equalsignorecase(string anotherstring) - j.w. - ale bez rozróżniania małych i wielkich liter. byte[] getbytes() zwraca tablicę bajtów reprezentujących ten napis w domyślnej stronie kodowej String example = "This is an example"; byte[] bytes = example.getbytes(); try { byte[] utf8bytes = example.getbytes("utf8"); System.out.println("Text UTF8: " + utf8bytes);//[b@7852e922 catch (UnsupportedEncodingException ex) { ex.printstacktrace(); System.out.println("Text: " + bytes);//[b@4e25154f

Klasa String -wybrane metody int indexof(string str) - zwraca indeks pozycji pierwszego wystąpienia w danym napisie napisu podanego jako argument str; jeżeli str nie występuje w tym napisie - zwraca -1 String str = "Welcome home"; System.out.println(str.indexOf( 'o' )); //4 int indexof(string str, int fromindex)- poszukuje pierwszego wystąpienia napisu str poczynając od pozycji oznaczonej przez indeks fromindex; zwraca indeks pozycji na której zaczyna się str lub -1 gdy str nie występuje w tym napisie. System.out.println(str.indexOf( 'o',5)); //9 int lastindexof(string str) - jak indexof - ale zwracany jest indeks pozycji ostatniego wystąpienia System.out.println(str.lastIndexOf( 'e' ));//11 int length() - zwraca długość napisu String replace(char oldchar, char newchar) - zwraca nowy obiekt klasy String, w którym zastąpiono wszystkie wystąpienia znaku oldchar na znak newchar. System.out.println(str.replace('h', 'H')); //Welcome Home 20

Klasa String -wybrane metody boolean startswith(string prefix)- zwraca true, gdy napis zaczyna się podanym jako argument łańcuchem znakowym; false - w przeciwnym razie. String str = "Welcome home"; System.out.println(str.startsWith("Welc") );//true String substring(int beginindex) - zwraca podłańcuch tego łańcucha znakowego zaczynający się na pozycji o indeksie beginindex (do końca łańcucha) String s="hello"; System.out.println(s.substring(2));//llo String substring(int beginindex, int endindex) - zwraca podłańcuch tego łańcucha jako nowy obiekt klasy String. Podłańcuch zaczyna się na pozycji o indeksie beginindex, a kończy (uwaga!) - na pozycji o indeksie endindex-1. Długość podłańcucha równa jest endindex beginindex. String s2 = "abcde".substring(2,3); System.out.println(s2);//c char[] tochararray()- znaki łańcucha -> do tablicy znaków (typ char[]). 21

Klasa String -wybrane metody 22 String tolowercase() - zamiana liter na małe. System.out.println("HELLO".toLowerCase());//hello String touppercase() - zamiana liter na duże. System.out.println("Hello".toUpperCase());//HELLO String trim() - usuwa znaki spacji, tabulacji, końca wiersza itp. tzw. białe znaki z obu końców łańcucha znakowego. Zwraca wynik jako nowy łańcuch. System.out.println(" Ala ma kota ".trim());//ala ma kota static String valueof(char c) - zwraca wartość typu char jako napis. static String valueof(char[] data) - zwraca napis złożony ze znaków z tablicy. String s3= String.valueOf(new char[]{'a','l','a'); System.out.println(s3); //ala static String valueof(double d) - zwraca znakową reprezentację liczby typu double. static String valueof(int i) - zwraca znakową reprezentację liczby typu int.

Klasa String 23 Uwaga. Zanim napiszemy fragment wykonujący określone zadanie na napisach, sprawdźmy w dokumentacji czy w klasie String nie ma metod, które by nam to ułatwiły. Kiedy porównujemy jakieś napisy, to zwróćmy uwagę na Czy białe znaki (spacje, tabulacje) ewentualnie okalające napis są istotne w porównaniu; jeśli nie to użyjmy metody trim() Czy chcemy porównać napisy, uwzględniając wielkość liter; jeśli nie, to użyjmy metod equalsignorecase lub ujednolićmy wielkość liter w napisach metodami touppercase()lub tolowercase() Przykład. Użytkownik odpowiada w dialogu wejściowym na pytanie. Uwzględnijmy to, że może wprowadzić niepotrzebne spacje lub użyć różnej wielkości liter. String ans=joptionpane.showinputdialog ("Czy mam wykonać program?"); if (ans!= null){ ans=ans.trim().touppercase(); switch(ans){ case "TAK": case "T" : execute();

String metoda join 24 W Javie 8 do klasy String dodano metody statyczne join(separator, zestaw_napisów) gdzie zestaw_napisów to albo argumenty-napisy oddzielone przecinkami, albo tablica napisów, albo kolekcja napisów. Metoda wstawia podany separator między elementy zestawu_napisów i zwraca tak utworzony String: Przykład: String res= String.join("-", "A", "B", "C"); System.out.println(res); //A-B-C int n=10; String[] stab = new String[n]; int sum=0; for (int i=1; i<=n; i++){ sum+=i; stab[i-1]=string.valueof(i); System.out.println(String.join("+",stab)+" = "+sum); //1+2+3+4+5+6+7+8+9+10 = 55

import javax.swing.*; public class Wycieczki { String - przykład 1 public static void main(string[] args) { String[] dest = {"Bali", "Cypr", "Ibiza", "Kenia", "Kuba"; double[] price = {5000, 2500, 2800, 4500, 6000; String msg = "Wybierz kierunek - " + " wpisując literę A-"+ (char) ('A'+dest.length-1)+ ":\n"; for (int i=0; i < dest.length; i++) msg += (char) ('A' + i) + " - " + dest[i] + '\n'; String res; while ((res = JOptionPane.showInputDialog(msg))!= null) { if (res.length() == 0) continue; int i = res.charat(0) - 'A'; if (i < 0 i >= dest.length) continue; JOptionPane.showMessageDialog(null, dest[i] + " - cena: " + price[i]); 25

String - przykład 2 26 public class ZnajdzAnd{ public static void main(string[] args) { // Tekst do analizy String text = "To be or not to be, that is the question;" + " Whether 'tis nobler in the mind to suffer" + " the slings and arrows of outragous fortunę," + " or to take arms against a sea of troubles," + " and by opposing end them?"; int licznikand = 0;// liczy wystąpienia and String andstr = "and"; // podłańcuch do wyszukania int index = text.indexof(andstr); // pierwsze and while(index >= 0) { ++licznikand; index += andstr.length() ; //przeskocz do pozycji //po pierwszym znalezionym and index = text.index0f(andstr, index); System.out.println("Tekst zawiera " + licznikand + " and");

StringBuffer, StringBuilder 27 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 niedopuszczalne)

StringBuffer, StringBuilder 28 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.

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 mamy StringBuffer 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(); 29

StringBuffer, StringBuilder 30 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".

Rozbiór tekstów - StringTokenizer 31 Bardzo często w programowaniu występują sytuacje, gdy trzeba rozbić, rozłożyć(dokonać analizy) jakiś tekst (napis) na poszczególne występujące w nim symbole (np. słowa, liczby). Symbolem nazywamy dowolny ciąg znaków który nie zawiera separatora. Do wyłuskiwania symboli z łańcuchów znakowych służy m.in. klasa StringTokenizer z pakietu java.util. Po to by dokonać rozbioru tekstu - tworzymy obiekt klasy StringTokenizer, podając jako argument konstruktora - tekst do rozbioru np. String expr = "21 + 21"; StringTokenizer st = new StringTokenizer(expr); Ta postać konstruktora zakłada domyślnie, że separatorami są znaki z następującego zestawu " \t\n\r\f" (czyli znak spacji, tabulacji, przejścia do nowego wiersza, powrotu karetki, nowej strony). W tym przypadku symbolami będą ciągi znaków, które nie zawierają żadnego z wymienionych separatorów

Rozbiór tekstów - StringTokenizer 32 Obiektu klasy StringTokenizer możemy teraz zapytać o to ile elementów zawiera przekazany konstruktorowi napis: int n = st.counttokens(); // n = 3 ("21 + 21") Wyłuskiwanie elementów odbywa się sekwencyjnie poczynając od początku łańcucha. Służy temu metoda nexttoken(), która zwraca kolejny element jako String. String s1 = st.nexttoken(); // napis "21" String s2 = st.nexttoken(); // napis "+" String s3 = st.nexttoken(); // napis "21" Gdy nie ma już elementów "do zwrotu" - wywołanie nexttoken() spowoduje powstanie wyjątku NoSuchElementException. Do stwierdzenia, czy w łańcuchu znakowym są jeszcze elementy do zwrotu służy metoda hasmoretokens().

Rozbiór tekstów - StringTokenizer Metoda hasmoretokens() zwraca true, jeśli w łańcuchu znakowym są jeszcze nie "wyłuskane" elementy i false w przeciwnym razie. Inaczej mówiąc: hasmoretokens() zwraca true, jeśli następne odwołanie do nexttoken() zwróci kolejny element i zwraca false, gdy ew. następne odwołanie do nexttoken() spowoduje wyjątek NoSuchElementException. Pętla, w której pobieramy kolejne elementy: while (st.hasmoretokens()) { String s = st.nexttoken(); //... tu coś robimy z s Inna postać konstruktora klasy StringTokenizer pozwala na określenie zbioru separatorów, które będą służyć do wyróżniania elementów. Jeżeli napiszemy np. StringTokenizer st = new StringTokenizer(s, "., "); //to separatorami będą kropka, przecinek i spacja. Inną klasą do analizy tekstów jest klasa StreamTokenizer, dostarcza ona nieco bardziej zaawansowanych sposobów rozbioru tekstów, ale wymaga operowania na strumieniach. 33

Rozbiór tekstów : metoda split Bardzo elastyczne możliwości analizy tekstów dają wyrażenia regularne. W dokumentacji StringTokenizer, do rozbioru tekstów zalecana jest metoda split z klasy String: public String[] split(string regex) Wywołanie txt.split(sep) zwraca tablicę symboli z tekstu txt rozdzielonych separatorami pasującymi do wzorca podanego przez napis- wyrażenie regularne sep. Przykład 1: String[] result = "this is a test".split("\\s"); for (int i=0; i<result.length; i++) System.out.println(result[i]); run: this is a test 34

Rozbiór tekstów : metoda split Przykład 2:(separator pojedyncza spacja, w tekście 2 spacje) String[] s = "Ala ma kota".split(" "); System.out.println(s.length); for (int i=0; i<s.length; i++) System.out.println("*"+s[i]+"*"); run: 4 *Ala* ** *ma* *kota* Przykład 3:(separator jedna lub więcej spacji, w tekście 2 spacje) String[] s = "Ala ma kota ".split(" +");//" +"jedna lub więcej spacji System.out.println(s.length); for (int i=0; i<s.length; i++) System.out.println("*"+s[i]+"*"); run: 3 *Ala* *ma* *kota* 35

Rozbiór tekstów : metoda split Przykład 4:(w tekście 2 spacje i spacja z przodu, sep: >=1 spacji) String[] s = " Ala ma kota ".split(" +");//1 lub więcej spacji System.out.println(s.length); for (int i=0; i<s.length; i++) System.out.println(s[i]); run: 4 Ala ma kota Tablica zawiera cztery elementy z których pierwszy jest pustym napisem, gdyż elementy tablicy zwracanej przez metodę split są podnapisami z których każdy jest zakończony podnapisem pasującym do wyrażenia regularnego lub końcem wiersza. Przykład 5 (to samo przy pomocy klasy StringTokenizer) String s = " Ala ma kota "; int i = 0; StringTokenizer st = new StringTokenizer(s); while (st.hasmoretokens()) { String el = st.nexttoken(); System.out.println(el); i++; System.out.println(i); run: Ala ma kota 3 36

Scanner wyrażenia regularne 37 Kolejną klasą służącą do analizy tekstów jest klasa Scanner. Często korzysta ona z wyrażeń regularnych, np. zestaw separatorów, na których skaner rozkłada teksty metodą next()jest wyrażeniem regularnym. Domyślnie jest to wyrażenie określające białe znaki, ale możemy go zmienić metodą usedelimiter(string regex) lub usedelimiter(pattern p). Metoda reset() przywraca domyślny wzorzec separatorów. Co więcej separatory można zmieniać w trakcie skanowania metody next(string regex)i next(pattern p) zwracają kolejny symbol ograniczony separatorami oraz pasujący do wzorca podanego w wyrażeniu i ustawiają pozycje skanera zaraz za nim lub gdy kolejny symbol nie pasuje do wzorca zwracany jest wyjątek NoSuchElementException. Odpowiednie metody hasnext(wyr_regularne) pozwalają stwierdzić, czy symbol jest dostępny. Niejako odwrotnością metod next( ) są metody skip( ), które pomijają separatory i kolejny symbol pasujący do wzorca i ustawiają pozycję skanera za nim, lub przy braku dopasowania zwracany jest wyjątek NoSuchElementException. Metody findinline(wyr_reg) i findwithinhorizon(wyr_reg) wyszukuja w tekście i zwracają napis pasujący do wzorca ignorując separatory. można używać wyrażeń przy pobieraniu liczb nextint(), nextdouble()(przy pobieraniu liczb rzeczywistych skaner uwzględnia lokalizację) Użycie wyrażeń regularnych w klasie Scanner jest podobnie jak w klasie String oparte na odwołaniach do klas Pattern i Matcher, ale jest to wykorzystanie efektywne, bo stosowane wzorce są kompilowane jednokrotnie i przechowywane do ponownego użycia.

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. 38

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 39

Wyrażenia regularne- podstawy 40 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.

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, 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 41

Wyrażenia regularne- podstawy 42 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.

Wyrażenia regularne- podstawy Typową sekwencję operacji, potrzebnych do zastosowania wyrażeń regularnych można opisać w następujący schematyczny sposób. //wymagany import java.util.regex.* A) Tekst, podlegający dopasowaniu może być reprezentowany przez obiekt dowolnej klasy implementującej interfejs CharSequence (np. String, StringBuffer, CharBuffer z pakietu java.nio) np: String text = "196570"; B) Tworzymy wyrażenie regularne jako napis np. String regexp = "[0-9]+"; C) Kompilujemy wyrażenie regularne i uzyskujemy skompilowany wzorzec. Pattern pattern = Pattern.compile(regexp); D) Tworzymy obiekt-matcher związany z danym wyrażeniem, podając przy tym tekst do dopasowania: Matcher matcher = pattern.matcher(text); E) Szukamy dopasowania tekstu ( w tekście ) zgodnie ze wzorcem np. boolean hasmatch = matcher.find(); albo: boolean ismatching = matcher.matches(); 43

Wyrażenia regularne- podstawy System.out.println("Tekst: "+ text +"\n"+ (ismatching?" ":"NIE ")+ " pasuje do wzorca:" +regexp); //nowy tekst wejściowy String text2 = "123 127"; //reset matchera matcher.reset(text2); ismatching = matcher.matches(); System.out.println("Tekst: "+ text2 +"\n"+ (ismatching?" ":"NIE ")+ " pasuje do wzorca:" +regexp); run: Tekst: 196570 pasuje do wzorca:[0-9]+ Tekst: 123 127 NIE pasuje do wzorca:[0-9]+ 44

Wyrażenia regularne- podstawy 45 Zdefiniujmy metodę, która jako argumenty otrzymuje wyrażenie regularne oraz analizowany za jego pomocą tekst, a zwraca opis wyników działania metod matches() i find(). String report(string regex, String text) { String result = "Wzorzec: \"" + regex + "\"\n" + // Kompilacja wzorca "Tekst: \"" + text + "\""; // Gdy wzorzec jest składniowo błędny // wystąpi wyjątek PatternSyntaxException Pattern pattern = null; try { pattern = Pattern.compile(regex); catch (Exception exc) { return result + "\n" + exc.getmessage(); // zwracamy komunikat o błędzie

Wyrażenia regularne- podstawy 46 // Uzyskanie matchera dla podanego tekstu Matcher matcher = pattern.matcher(text); // Próba dopasowania całego tekstu do wzorca boolean ismatching = matcher.matches(); result += "\nmatches(): Cały tekst" + (ismatching? "" : " NIE") + " pasuje do wzorca."; // Przywrócenie początkowej pozycji matchera matcher.reset(); // Teraz stosujemy metodę find() // Jej wywołanie zwraca true po znalezieniu pierwszego // pasującego do wzorca podłańcucha w tekście // Kolejne wywołania pozwalają wyszukiwać kolejne // pasujące podłańcuchy.

Wyrażenia regularne- podstawy // Wynik false oznacza, że w tekście nie ma już // pasujących podłańcuchów boolean found = matcher.find(); if (!found) result += "\nfind():nie znaleziono żadnego podłańcucha " +"pasującego do wzorca"; else do { result += "\nfind(): Dopasowano podłańcuch \"" + matcher.group() + while(matcher.find()); return result; "\" od pozycji " + matcher.start() + " do pozycji " + matcher.end() + "."; 47