INE2 Von C zu Java Teil 2: Arrays und Strings
Transcription
INE2 Von C zu Java Teil 2: Arrays und Strings
INE2 Von C zu Java Teil 2: Arrays und Strings ■ Arrays ■ Referenzdatentypen ■ Strings 1 Arrays School of Engineering © G. Burkert, K. Rege, ZHAW 2 von 64 Array ■ Was ist ein Array ? 18 17 21 12 15 8 14 1 33 15 8 12 33 17 18 1 21 14 Index: 0 1 2 3 4 5 6 7 8 Ein Array ist eine Gruppe von Variablen gleichen Typs und gleicher Bedeutung, die sinnvoll unter demselben Namen angesprochen und intern durchnummeriert werden School of Engineering © G. Burkert, K. Rege, ZHAW 3 von 64 Array ■ Entspricht einer Tabelle mit nur einer Zeile ■ Variablenname bezeichnet die ganze Tabelle ■ Einzelner Eintrag: Element, Komponente ■ Merkmale ■ Alle Daten eines Arrays haben den gleichen Datentyp ■ Einzelnes Element wird durch seinen Index adressiert School of Engineering © G. Burkert, K. Rege, ZHAW 4 von 64 Arrays in C (Wh) ■ Wie haben wir Array-Variablen in C definiert? ■ Zum Beispiel: ■ Die sechs Lottozahlen? ■ Die Anzahl Tage jedes Monats im Jahr? ■ Muss man bei der Definition einer Array-Variablen in C die Array-Grösse angeben? ■ Welche zwei Möglichkeiten zum Anlegen und Verwenden von Arrays gibt es in C? School of Engineering © G. Burkert, K. Rege, ZHAW 5 von 64 Deklaration eines Arrays in Java Datentyp[] Arrayname; ■ Datentyp: Datentyp der einzelnen Elemente ■ Das Array existiert nach der Deklaration noch nicht, erst der Variablenname ■ Die Anzahl Elemente im Array sind ebenfalls noch nicht bestimmt ■ Beispiel: ■ int[] fahrtenAmSo; School of Engineering © G. Burkert, K. Rege, ZHAW 6 von 64 Arrays / Felder Array-Datentyp ↔ Element-Datentyp int[] Element-Datentyp Array-Datentyp Beachte: Die tatsächliche Länge des Array gehört nicht zum Array-Datentyp Deklaration,nur die Tatsache, dass es ein Array ist! School of Engineering © G. Burkert, K. Rege, ZHAW 7 von 64 Anlegen eines Arrays in Java Arrayname = new Datentyp [Arraygrösse]; ■ Beispiel: ■ fahrtenAmSo = new int[8]; ■ Reserviert Speicher für einen Array mit 8 Elementen vom Typ int School of Engineering © G. Burkert, K. Rege, ZHAW 8 von 64 Unterschied C – Java C int a[5]; // deklariert a und reserviert Platz fuer // 5 int Java int[] a; a = new int[5]; // deklariert a // reserviert Platz fuer 5 int C int * a; // oder int a[] in Funktionsdeklaration a = (int *)malloc(5*sizeof(int)); // reserviert Platz fuer 5 int School of Engineering © G. Burkert, K. Rege, ZHAW 9 von 64 Initialisierung ■ Array-Elemente bei der Erzeugung auf die Default-Werte gesetzt ■ Für int-Arrays ist der Default-Wert 0 ■ Möglichkeiten zur expliziten Initialisierung: Jedes Element einzeln: Besser: Mit for-Schleife: fahrtenAmSo[0] = 1; fahrtenAmSo[1] = 1; ... fahrtenAmSo[7] = 1; for (int i=0; i<8; i++){ fahrtenAmSo[i] = 1; } Direkt bei der Deklaration des Arrays: int[] fahrtenAmSo = {1,1,1,1,1,1,1,1}; School of Engineering © G. Burkert, K. Rege, ZHAW 10 von 64 Initialisierung ■ Wenn ein Array direkt initialisiert wird, wird dabei auch die Grösse des Arrays festgelegt: double[] messWerte= {1.5, 7.3, 3.6, 9.4}; // Grösse 4 ■ Der Initialisierungsausdruck mit geschweiften Klammern ist nur bei der Deklaration erlaubt double[] messWerte; messwerte = {1.5, 7.3, 3.6, 9.4}; // geht nicht ! messWerte = new double[] {1.5, 7.3, 3.6, 9.4}; // ok School of Engineering © G. Burkert, K. Rege, ZHAW 11 von 64 Zugriff auf Array-Elemente Arrayname[index] ■ Greift auf das Element mit dem angegebenen Index zu ■ Das erste Element hat den Index 0 ! ■ Ein Array-Element kann verwendet werden wie eine Variable vom entsprechenden Datentyp: ■ Zuweisung, Eingabe, Ausgabe, Argument bei Methodenaufruf, usw. ■ Beispiel: wert = a[index]; // ein Element lesen a[index] = 5; // in ein Element schreiben School of Engineering © G. Burkert, K. Rege, ZHAW 12 von 64 Länge eines Arrays ■ Die Länge eines Arrays wird beim Erzeugen festgelegt ■ Sie kann dann nicht mehr verändert werden ■ Sie ist in einer Instanzenvariable des Array-Objekts gespeichert: arrayname.length ■ Achtung: Das ist keine Methode, also nicht: arrayname.length() School of Engineering © G. Burkert, K. Rege, ZHAW 13 von 64 Final, Umgang mit Array-Elementen ■ Oft werden Arrays mit for-Schleifen bearbeitet final int ANZAHL = 100; Tipp: int[] zweierReihe; zweierReihe = new int[ANZAHL]; for (int i = 0; i < zweierReihe.length; i++) { ■ Array-Grössen in Konstanten (mit final) angeben zweierReihe[i] = i*2; ■ mit length arbeiren } School of Engineering © G. Burkert, K. Rege, ZHAW 14 von 64 Umgang mit Arrays ■ Arrays sind Java-Objekte ■ Sie werden sie als Referenz (s.u.) übergeben ■ Bei der Parameterdeklaration im Methodenkopf muss die Länge des übergebenen Arrays nicht spezifiziert werden: public int summe(int[] arr) { ... } School of Engineering © G. Burkert, K. Rege, ZHAW 15 von 64 Umgang mit Arrays: Beispiel public int summe(int[] arr) { int total = 0; for (int i =0; i < arr.length; i++) { total = total + arr[i]; } return total; } ■ Aufruf: int[] reihe = {1,2,3,4}; int sum; sum = summe(reihe); School of Engineering © G. Burkert, K. Rege, ZHAW 16 von 64 Übung ■ Schreiben Sie eine Methode, die das grösste Element in einem beliebig langen Array von ganzen Zahlen zurückgibt ■ Die Methode soll nur den Wert des grössten Elementes zurückgeben School of Engineering © G. Burkert, K. Rege, ZHAW 17 von 64 Arrays von Objekten ■ Array von Strings: String[] arbeitstage = {"Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag"}; int tag = 2; String tagname; tagname = arbeitstage[tag]; ■ Welchen Index hat der Dienstag? School of Engineering © G. Burkert, K. Rege, ZHAW 18 von 64 Programmierfehler ■ Der gewählte Index liegt ausserhalb des erlaubten Bereichs ■ ArrayIndexOutOfBoundsException ■ Ein Array wird verwendet, bevor es erzeugt wird ■ Nullpointer-Exception In Java ist es nicht möglich ausserhalb der Array Grenzen zuzugreifen In Java gibt es das Dangling Pointer Problem nicht School of Engineering © G. Burkert, K. Rege, ZHAW 19 von 64 Zweidimensionale Arrays ■ Beispiel: Umsatzzahlen eines Geschäftes mit 3 Filialen für eine Woche School of Engineering © G. Burkert, K. Rege, ZHAW 20 von 64 Zweidimensionale Arrays in Java ■ Array, dessen Elemente ebenfalls wieder Arrays sind ■ Deklaration: Datentyp[][] Arrayname; ■ Erzeugung des Arrays: Arrayname = new Datentyp [AnzahlZeilen][AnzahlSpalten]; ■ Beispiel: int[][] umsatz; umsatz = new int [3][7]; ■ Analog sind auch mehrdimensionale Arrays möglich School of Engineering © G. Burkert, K. Rege, ZHAW 21 von 64 Zweidimensionale Arrays in Java ■ Beispiel: Schachbrett String[][] schachbrett; final int GROESSE = 8; schachbrett = new String[GROESSE][GROESSE]; ■ Beispiel: Kinoplätze boolean[][] kinoplatz; int anzReihen = 10; anzPlaetzeProReihe = 20; kinoplatz = new boolean[anzReihen][anzPlaetzeProReihe]; School of Engineering © G. Burkert, K. Rege, ZHAW 22 von 64 Zweidimensionale Arrays in Java ■ Initialisierung ■ Bei der Deklaration: int [][] tabelle = {{1,0,1},{0,1,0}}; ■ Im Programmcode mit for-Schleifen ■ Zugriff auf Array-Elemente Arrayname[zeilenindex][spaltenindex] ■ Beispiel: // Element in der 3. Zeile und 4. Spalte des Arrays umsatz: int ums = umsatz[2][3]; School of Engineering © G. Burkert, K. Rege, ZHAW 23 von 64 Referenzdatentypen School of Engineering © G. Burkert, K. Rege, ZHAW 24 von 64 Referenzdatentyp ■ Array sind Referenzendatentypen ■ Im Gegensatz zu einfachen Datentypen ■ Einfache Datentypen (Wh): ■ Speichern und Verarbeiten einzelne Werte (Zahlen, Buchstaben, logische Werte) ■ Variablenname bezeichnet den Speicherplatz, wo der Wert abgespeichert ist ■ Speicherplatz wird bei der Deklaration der Variablen reserviert School of Engineering © G. Burkert, K. Rege, ZHAW 25 von 64 Einfache Datentypen (Wertetypen - Whd) ■ Nur ein Wert int, double, double, boolean, char, ... ■ Bei Zuweisungen und Methodenaufrufen wird nur Kopie des Wertes übergeben („by value“) a = 5; a 5 b 7 5 b = 7; b = a; School of Engineering © G. Burkert, K. Rege, ZHAW 26 von 64 Referenzdatentyp ■ Speichern und Verarbeiten mehrerer Werte zusammen ■ Die einzelnen Werte vom gleichen oder von unterschiedlichem Datentyp sein ■ Beispiel: Klassen, Arrays (Felder) ■ Bei der Deklaration der Variablen wird nur Platz für die Adresse der eigentlichen Daten reserviert ■ Daher auch als Referenzdatentypen bezeichnet School of Engineering © G. Burkert, K. Rege, ZHAW 27 von 64 Speicherbereich anlegen ■ Der Speicherbereich für die eigentlichen Daten wird durch eine explizite Anweisung dynamisch im Arbeitsspeicher (Heap) angelegt: fahrtenAmSo = new int[8]; // Array ■ Der benötigte Speicherplatz wird im Arbeitsspeicher reserviert und die Startadresse dieses Speicherbereichs in den Speicherplatz für die Referenz abgelegt ■ Vor der Erzeugung des Objekts enthält die Variable noch keine gültige Referenz (null) School of Engineering © G. Burkert, K. Rege, ZHAW 28 von 64 Referenzdatentypen ■ Bei Zuweisungen und Methodenaufrufen wird nur Kopie der Adresse (Referenz) übergeben double[] messWerte = { ... }; ■ Nach einer Zuweisung existieren 2 Referenzen auf dasselbe Objekt neueWerte = messWerte; School of Engineering double[] neueWerte; messWerte Ref neueWerte null Ref © G. Burkert, K. Rege, ZHAW 29 von 64 Datenübergabe ■ Einfache Datentypen: Bei der Zuweisung oder der Übergabe von Daten an Methoden wird der Wert der Variablen übergeben („call by value“) ■ Referenzdatentypen: Wie bei einfachen Typen, der Wert ist dann aber eine Referenz, d.h. die Adresse der Daten ■ Nach einer Zuweisung var1 = var2; stellen beide Variablen also Referenzen auf dieselben Daten dar ■ Bei der Datenübergabe an eine Methode werden ebenfalls Referenzen übergeben: Methode arbeitet mit den Originaldaten, nicht mit einer Kopie! School of Engineering © G. Burkert, K. Rege, ZHAW 30 von 64 Methodenaufruf public void foo() int[] a = {1,2,3,4}; bar( ); a System.out.println("Result = "+ a[0]); } public void bar(int[] b) { b[0] = 2; } Button 1,2,3,4 1,2,3,4 “A“ School of Engineering © G. Burkert, K. Rege, ZHAW 31 von 64 Strings School of Engineering © G. Burkert, K. Rege, ZHAW 32 von 64 Strings in Java ■ Ein String (eine Zeichenkette) ist eine beliebig lange Folge von Zeichen (Characters): ■ ■ ■ Ich bin ein String 2347320984732984 _owjddpoie;:-opüäw%jpowB“+^\/wljd ■ Strings werden in Programmen sehr häufig verwendet ■ ■ ■ ■ Ausgabe von Meldungen Einlesen von Benutzereingaben Lesen und Schreiben von Textdateien Namen von Verzeichnissen, URLs ■ In Java werden Strings als Objekte behandelt ■ ■ Ein Objekt enthält einen String beliebiger Länge Die Zeichen im String werden wie in einem Array indexiert: 0...(Länge – 1) School of Engineering © G. Burkert, K. Rege, ZHAW S t r i n g (0) 0 1 2 3 4 5 33 von 64 Deklaration und Initalisierung Referenzdatentyp: String ■ ■ String ist ein Object -> Referenztyp Strings sind unveränderbar (immutable Object). ■ Deklaration, Initialisierung: ■ String stringName [= "Zeichenfolge"]; ■ Zeichenfolgen (String Literals) stehen immer zwischen doppelten Anführungszeichen ■ Frage: Unterschied zw. c = 'a' und s = "a" ? ■ Beispiele: ■ ■ String name; String name = new ("Hugo"); name name School of Engineering © G. Burkert, K. Rege, ZHAW "Hugo" "Hugo" 34 von 64 Erzeugung von Strings ■ Erzeugung von Strings ■ ■ ■ ■ ■ ■ ■ name = new ("Hugo"); str = "Hello"; String str = "Hello"; String str = ""; str = name; // gebräuchliche Schreibweise // Deklaration und Initialisierung // Leerer String Dabei werden nicht einfach die Referenzen kopiert ! Sondern str wird echte Kopie von name zugewiesen ■ Obwohl Strings Objekte sind, verhalten Sie sich wie Wertedatentypen name name "Hugo" "Hugo" copy str = name; str str School of Engineering © G. Burkert, K. Rege, ZHAW "Hugo" "Hugo" 35 von 64 Array of Strings ■ Array of Strings: ■ String[] staedte = new String[2]; staedte[0] = "Winterthur"; staedte[1] = "Zuerich"; ■ Erzeugung von Arrays of Strings ■ String [] bergsteiger = {"Messner","Seiler","Sherpa","Yeti"}; School of Engineering © G. Burkert, K. Rege, ZHAW 36 von 64 Strings als Methodenparameter ■ Bereits bei Zuweisungen von Strings haben wir gesehen, dass sich Strings in wie primitive Datentypen verhalten: ■ String str1 = "Hello, World"; String str2 = str1; // Komplette Kopie von str1 ■ Dasselbe gilt für die Parameterübergabe: ■ ■ ■ Der übergebene String verhält sich in der Methode wie eine lokale Kopie Änderungen innerhalb der Methode haben keinen Einfluss auf den übergebenen String Sollen die Änderungen zurückgegeben werden g return ■ Beispiel: private String dupliziere(String str) { str = str + str; return str; } … str2 = dupliziere(str1); School of Engineering © G. Burkert, K. Rege, ZHAW 37 von 64 Stringgrundoperationen School of Engineering © G. Burkert, K. Rege, ZHAW 38 von 64 Konvertierung und Verkettung von Strings ■ Konvertierung einer Zahl in einen String: ■ ■ int zahl = 123; String zahlStr1 = "" + zahl; String zahlStr2 = Integer.toString(zahl); // implizit // explizit i.M. zahl = Integer.parseInt("123"); ■ Zusammenhängen von Strings mit dem + Operator: ■ String str1 = "Hello, "; String str2 = "World!"; String str3 = str1 + str2; // Hello, World! ■ Verketten mit Zahlen: ■ String str1 = "Hallo " + 1 + 2; // "Hallo 12" String str2 = "Hallo " + (1 + 2); // "Hallo 3" School of Engineering © G. Burkert, K. Rege, ZHAW 39 von 64 Vergleich von Strings ■ Test auf Gleichheit ■ häufige gemachter Fehler: verwenden von "==": String s = "abc"; // new String("abc") String t = "abc"; // new String("abc") if (s == t) {} : testet auf Gleichheit von Referenz = false ■ equals-Methode von String verwenden if (s.equals(t)) {} : teste auf Gleichheit von Wert = true ■ equalsignoreCase ignoriert Grossklein-Schreibung String v = "ABC"; s.equalsignoreCase(v); ss "abc" "abc" s == t; tt School of Engineering © G. Burkert, K. Rege, ZHAW s.equals(t); "abc" "abc" 40 von 64 Reihenfolge von Strings ■ int compareTo(String str); ■ compareTo Methode bestimmt Reihenfolge String a = "ameise"; String b = "biene" int n = a.compareTo(b); n == 0: n < 0: n > 0: a ist gleich b a steht vor b "ameise" < "biene" a steht nach b ■ Aber : "ameise" kommt nach "Biene" (Zeichen-Code Reihenfolge) ■ Lexikographischer Vergleich von str mit dem gegebenen String ■ Strings werden zeichenweise von links nach rechts verglichen Kein Zeichen kommt vor Sonderzeichen kommt vor Zahlen kommt vor Grossbuchstaben kommt vor Kleinbuchstaben (entspricht dem jeweiligen Unicode der Zeichen) ■ "a" kommt vor "b" "a" kommt nach "Z" ■ "abcdzzzz" kommt vor "abce" "a" kommt vor "ab" ■ ■ "a1 " kommt nach "a1" ■ "10" kommt vor "2" School of Engineering "Anna" kommt © G. Burkert, K. Rege, ZHAW vor "anna" 41 von 64 Stringmanipulationen School of Engineering © G. Burkert, K. Rege, ZHAW 42 von 64 String-Methoden – Manipulationen ■ Wichtig: der aktuelle String wird nicht verändert, sondern Methode gibt einen neuen String zurück (Strings = immutable Objects)! ■ String replace(char alt, char neu); ■ String replace(string alt, string neu); ■ ■ String str1 = "Abrakadabra"; String str2 = str1.replace('a', 'u'); // Abrukudubru str2 = str2.replace('u', 'a'); // es wird ein neues str2 kreiert ■ String toLowerCase(); ■ str2 = str1.toLowerCase(); // abrakadabra ■ String toUpperCase(); ■ str2 = str1.toUpperCase(); // ABRAKADABRA ■ String trim(); ■ ■ Entfernt White Space am Anfang und am Ende str1 = " \t viel leerer Raum \n\n \t "; str2 = str1.trim(); // viel leerer Raum School of Engineering © G. Burkert, K. Rege, ZHAW 43 von 64 Bei umfangreichen String Manipulationen ■ StringBuffer (oder StringBuilder) für umfangreiche Manipulationen auf Strings ■ Inhaltsveränderung bei StringBuffer möglich! ■ Enthält Methoden, um den eingebetteten String direkt zu manipulieren (z.B. insert, append) ■ Beispiel umfangreiche Mutationen auf Strings: ■ nicht String s = ""; for (int i = 0; i < 1000; i++) { s = s + i; } ■ sondern StringBuffer buf = new StringBuffer(); for (int i = 0; i < 1000; i++) { buf.append(Integer.toString(i)); buf.append(","); } String s = buf.toString(); School of Engineering © G. Burkert, K. Rege, ZHAW 44 von 64 String-Methoden – Untersuchung ■ Beispiel-String für die nachfolgenden Methoden: String str1 = "eins zwei drei"; 01234567… // Position ■ int length(); ■ Achtung: Achtung:bei beiArrays: Arrays: array.length (ohne array.length (ohne Klammern) Klammern) // Methode: gibt zurück Anz. Chars im String int len = str1.length(); // 14 ■ char charAt(int index); ■ ■ str1 = "eins zwei drei"; char zeichen = str1.charAt(2); // n ■ int indexOf(String str); int indexOf(String str, int index); ■ Sucht str im gegebenen String; Beginn der Suche bei index oder von Anfang an ■ Gibt Position des ersten Auftretens zurück oder -1 falls nicht gefunden int pos = str1.indexOf("dre", 6); // 10 ■ School of Engineering © G. Burkert, K. Rege, ZHAW 45 von 64 String-Methoden – Untersuchung ■ int lastIndexOf(String str); int lastIndexOf(String str, int index); Wie indexOf, sucht aber das letzte Auftreten von str ■ Sucht rückwärts, beginnend bei index oder vom Ende weg ■ int pos = str1.lastIndexOf("e"); ■ // 12 ■ boolean startsWith(String str); boolean endsWith(String str); ■ true, wenn der gegebene String mit str beginnt/endet, sonst false School of Engineering © G. Burkert, K. Rege, ZHAW 46 von 64 Zerlegung von Strings School of Engineering © G. Burkert, K. Rege, ZHAW 47 von 64 Zerlegung von Strings ■ Oftmals ist man nur an einem Teil des Strings interessiert ■ Herauslösen eine Teilstrings aus dem Original ■ ■ anhand Positionen : z.B. 4..6 anhand Muster im String: z.B. "IP Adresse= 123.121.12.31" ■ Zerteilen des Strings in Teile, die durch Trennzeichen getrennt sind ■ z.B. "23, 454, 63, 21, 56" School of Engineering © G. Burkert, K. Rege, ZHAW 48 von 64 Anhand Positionen ■ String substring(int start, int afterEnd); ■ Gibt Substring zwischen den Zeichen start (inkl. und afterEnd (exkl.) zurück String str1 = "Biene" String str2 = str1.substring(1, 4); // ien String str3 = str1.substring(1); //bis zum Schluss: iene ■ Das erste Zeichen hat Index 0 ■ Das zweite optionale Argument ist der Index des ersten Zeichens nach dem gewünschten Teilstring ■ Vorsicht ■ beide Werte müssen im gültigen Index Bereich des Strings sein, sonst Laufzeitfehler B 0 School of Engineering i 1 e 2 n 3 e 4 © G. Burkert, K. Rege, ZHAW 49 von 64 Zerteilen von Strings: StringTokenizer ■ StringTokenizer (Zer-)teilt einen String in Substrings (Tokens) auf; die Tokens im String sind durch Grenzmarken abgetrennt ■ Grenzmarken basieren auf einer Liste der Zeichen ■ Mögliche Anwendung: Untersuchung von Daten aus einem Text-File, einzelne Datensätze sind z.B. durch Komma, Leerzeichen Zeilenumbruch oder Tab getrennt ■ Generierung der Tokens: ■ String data = "4, 5, 6 2,8,, 100, 18"; StringTokenizer tokens = new StringTokenizer(data, "\t\n ,"); java.util.* java.util.* ■ Resultiert in 7 Tokens: 4 5 6 2 8 100 18 ■ Man beachte: Folgen von Trennzeichen werden zusammengefasst String Stringmit mitTrennzeichen: Trennzeichen:tab, tab, Leerzeichen; Leerzeichen;Zeilenumbruch Zeilenumbruch oder oder",""," ■ Die Tokens sind im StringTokenizer-Objekt enthalten und können nachfolgend abgefragt werden School of Engineering © G. Burkert, K. Rege, ZHAW 50 von 64 Abfragen der Tokens im StringTokenizer ■ String nextToken(); ■ Gibt das vorderste Token zurück und entfernt es von der Liste der Tokens ■ boolean hasMoreTokens(); ■ Testet, ob noch Tokens vorhanden sind ■ int countTokens(); ■ Gibt die Anzahl noch vorhandener Tokens zurück ■ Beispiel Tokenizer tokens = new StringTokenizer(data, "\t\n ,"); while (tokens.hasMoreTokens()) { System.out.println(tokens.nextToken())); } ■ Æ in neuen Java-Programmen eher "split" verwenden-> später School of Engineering © G. Burkert, K. Rege, ZHAW 51 von 64 Reguläre Ausdrücke School of Engineering © G. Burkert, K. Rege, ZHAW 52 von 64 Reguläre Ausdrücke: Regex ■ Zum Suchen von definierten Mustern in Texten d.h. Strings ■ ■ ■ ein bestimmter String: "ZHAW" Muster kann "unscharf" definiert sein: z.B. ST15a, ST15b,ST14ac (Teil-)Muster kann sich wiederholen: 170.12.34.12 ■ Die meisten heutigen Programmiersprachen unterstützen die Suche nach Muster in Form von reguläre Ausdrücke (Regular Expressions oder kurz Regex) ■ Regex ist unabhängig von Java definiert ■ Java Klassenbibliothek definiert im Package java.util.regex ■ die Klassen Pattern und Matcher School of Engineering © G. Burkert, K. Rege, ZHAW 53 von 64 Definition des regulären Ausdrucks ■ Zuerst muss der reguläre Ausdruck vorbereitet werden ■ Die Klasse Pattern ■ Pattern pat = Pattern.compile("ZHAW"); ■ Das Muster kann im einfachsten Fall ein Textzeichen-String sein ■ Alle Zeichen sind erlaubt ausser: ([{\^-$|]})?*+. ■ Diese müssen mit \ vorangestellt geschrieben werden ■ Vorsicht in Java String Konstante muss "\\" für "\" geschrieben werden ■ Beispiel ■ Pattern pat = Pattern.compile("wie geht's \\?"); School of Engineering © G. Burkert, K. Rege, ZHAW 54 von 64 Abfrage nach den gefundenen Stellen ■ Ausgabe der gefundenen Stellen ■ Die Klasse Matcher ■ Matcher matcher = pat.matcher("Willkommen an der ZHAW"); ■ Suche nächste Textstelle boolean find() ■ true falls gefunden ■ matcher.find(); ■ Gebe gefunden Teilstring zurück String group() ■ matcher.group(); ZHAW ■ Start und Endposition innerhalb String int start() und int end() ■ matcher.start(); //18 ■ matcher.end(); //22 School of Engineering © G. Burkert, K. Rege, ZHAW 55 von 64 Vollständiges Beispiel import java.util.regex.*; … Pattern pat = Pattern.compile("ZHAW"); Matcher matcher = pat.matcher("Willkommen an der ZHAW"); while (matcher.find()) { String group = matcher.group(); int start = matcher.start(); int end = matcher.end(); // do something } School of Engineering © G. Burkert, K. Rege, ZHAW 56 von 64 Platzhalter ■ Oftmals wird nach unscharfen Muster gesucht, z.B. alle ET Klassen ■ Es sind Platzhalter Zeichen erlaubt, die Zeichenmengen matchen ■ z.B. "." für beliebiges Zeichen "\d" für Zahl, ^\d für keine Zahl Platzhalter Beispiel . a.b \d \d\d \D \D ^ ^\d \s \s \S \S Bedeutung Ein beliebiges Zeichen Digit[0-9] kein Digit Negation Leerzeichen (Blank,etc) kein Leerzeichen Menge der gültigen Literale aab, acb, aZb, a[b, ... 78, 10 a, b , c a, b , c blank, tab, cr, ■ Aufgabe: Geben Sie das Suchmuster für beliebige ST Klassen an: ST15a, ST15b, ST14a ET\d\d. School of Engineering © G. Burkert, K. Rege, ZHAW 57 von 64 Eigene Zeichenmengen ■ Statt vordefinierte Zeichenmengen zu verwenden, können auch eigene definiert werden ■ diese werden in "[" "]" geklammert ■ Aufzählung der Zeichen in der Zeichenmenge ■ ■ ein Zeichen aus der Menge z.B. "a", "b" oder "c" : [abc] ■ Bereiche ■ z.B. alle Kleinbuchstaben [a-z] alle Buchstaben [a-zA-Z] ■ Negation: Alle Zeichen ausser ■ z.B. [^a] ■ Aufgabe: Geben Sie das Suchmuster für beliebige ET Klassen an; es gäbe aber nur "a" bis "d" ET\d\d[a-d] School of Engineering © G. Burkert, K. Rege, ZHAW 58 von 64 Optional, Alternative und Wiederholung ■ Optionale Teile: ? ■ wenn einzelner Buchstaben optional, z.B. ZHA?W -> ZHW oder ZHAW ■ Alternative | ■ ■ wenn ein A oder B -> ZH(A|B)W -> ZHAW oder ZHBW "natürliche" Verwendung von Klammern Wiederholungen Auch Auch00mal mal erlaubt erlaubt ■ Beliebig oft * ■ eine Folge von Ziffern \d* -> _, 2,23,323,423,.. ■ Mindestens einmal + ■ eine Folge von Ziffern aber mindest eine \d+ -> 3,34,234,… ■ Bestimmte Anzahl mal {n} ■ eine Folge von drei Ziffern \d{3} -> 341,241,123 .. ■ Mindestens, maximal Anzahl mal {n,m} ■ eine Folge von 1 bis 3 Ziffern \d{1,3} -> 1, 23, 124, ... School of Engineering © G. Burkert, K. Rege, ZHAW 59 von 64 Zusammenfassung Metasymbole ■ (Meta-)Sprache zur Beschreibung der Bildungsregeln von Sätzen ■ Metasymbole: *,+,?,|,(),.[] Metasymbol * + ? | () . [] [-] \d \D ^ \s \S School of Engineering Beispiel ax*b ax+b ax?b a|b x(a|b)x a.b [abc]x [a-h] \d\d \D ^\d \s \S Bedeutung 0 oder mehrere x 1 oder mehrere x x optional a oder b Gruppierung Ein beliebiges Zeichen 1 Zeichen aus einer Menge Zeichenbereich Digit[0-9] kein Digit Negation Leerzeichen (Blank,etc) kein Leerzeichen Menge der gültigen Literale ab, axb, axxb, axxxb, ... axb, axxb, axxxb, ... ab, axb a, b xax, xbx aab, acb, aZb, a[b, ... ax, bx, cx a,b,c, ..., h 78, 10 a, b , c a, b , c blank, tab, cr, © G. Burkert, K. Rege, ZHAW 60 von 64 Weitere String-Methoden für Regex ■ Prüfe of String einem Regex Muster entspricht ■ boolean matches(String regexp); ■ String text = "Hallo Welt"; boolean passt; passt = text.matches("H.*W.*"); passt = text.matches("H..o Wel?t"); passt = text.matches("H[alo]* W[elt]+"); passt = text.matches("Hal+o Welt.+"); // // // // true false true false ■ Aufgabe: Regex zum Prüfen ob ein String eine Int Zahl enthält -?\d+ ■ Aufgabe: Regex zum Prüfen ob ein String eine IP Adresse enthält \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} School of Engineering © G. Burkert, K. Rege, ZHAW 61 von 64 … Weitere String-Methoden für Regex ■ String replaceAll(String regexp, String replaceStr); ■ String replaceFirst(String regexp, String replaceStr); ■ ■ Ersetzt im gegebenen String alle (bzw. den Ersten bei replaceFirst) Substrings, die regexp entsprechen, mit replaceStr String new = text.replaceAll("l+", "LL"); // HaLLo WeLLt ■ String[] split(String regexp); ■ Teilt den gegebenen String in mehrere Strings, regexp ist die Grenzmarke ■ Das Resultat ist ein Array mit Teilstrings String data = "4, 5, 6 2,8,, 100, 18" String[] teile = data.split("[ ,]+"); // 4 5 6 2 8 100 18 // teile[0] = "4", teile[1] = "5", …. ■ ■ School of Engineering // Menge der Zeichen " " und"," © G. Burkert, K. Rege, ZHAW 62 von 64 Reguläre Ausdrücke – Übung School of Engineering © G. Burkert, K. Rege, ZHAW 63 von 64 Noch Fragen? School of Engineering © G. Burkert, K. Rege, ZHAW 64 von 64