Ich einmal eure Aufmerksamkeit haben, bitte. Also,
ich bin leer, ich komme von Frühstarter,
vielleicht habt ihr schon mal von Frühstarter gehört,
wenn nicht, erkläre ich euch jetzt mal ganz kurz,
wer wir sind und was wir eigentlich machen.
Also, Frühstarter ist eine Gruppe von Studenten, ursprünglich aus Lüneburg,
die jetzt aber hier an mehreren Universitäten tätig ist.
Und wir organisieren Unternehmensführungen für Studenten. Also,
wenn ihr jetzt zum Beispiel ein Praktikum sucht oder ihr seid
einfach mal neugierig in ein Unternehmen reinzugucken oder ihr sucht
eine Werkstudenttätigkeit oder wollt eure Abschlussarbeit bei einem Unternehmen schreiben,
dann Macht auf jeden Fall mit.
Es ist ganz einfach. Man kann sich... Viele von euch
haben auch schon diese Magazine in der Hand. Da steht nochmal ganz genau drin,
welche Unternehmen von Frühstarter vorgestellt werden,
sind halt vor allem regionale Unternehmen,
die ihr vielleicht noch nicht so kennt,
aber da ist einiges dabei vom Chemiekonzern bis zur Werbeagentur und für Informatiker ist da auch,
glaube ich, einiges Spannendes dabei.
Genau, wenn ihr Lust darauf habt,
dann geht einfach auf Frühstarter.de,
meldet euch mit eurer Mailadresse an und dann bekommt ihr
eine Einladung zu diesen Veranstaltungen
Müsst ihr gar keine Angst vor Werbung haben oder sowas,
ihr bekommt echt einmal nur die Mail und dann wird gefragt,
habt ihr Lust zu dieser Veranstaltung zu kommen?
Ist gut, wenn ihr euch anmeldet,
weil es gibt nur eine begrenzte Anzahl von Plätzen,
aber wir versuchen auf jeden Fall alle Leute da mit reinzubekommen.
Und wenn ihr dann doch nicht kommt,
ist es auch nicht so schlimm, aber es wäre natürlich gut,
weil es macht auf jeden Fall Spaß.
Ja, so ein kleiner Überblick,
was wir so für Unternehmen haben, also zum Beispiel Basler,
vielleicht habt ihr das schon mal von gehört.
Stolz, Webnets und bla bla Karken, wahrscheinlich auch jeder.
Ja, genau, also die Unternehmensführung starten jetzt
schon nächste Woche. Deswegen wäre es gut euch,
wenn ihr euch jetzt anmeldet und habt
noch jemand Fragen
Okay, dann vielen Dank und viel Spaß bei der Vorlesung.
Ich muss ein bisschen was zu mir
So, jetzt mit leichter Verspätung fange ich auch an. Ach,
schön, dass noch ein paar Leute hier sitzen und nicht
alle immer nur auf der Couch sich die Vorlesung anschauen.
Das tue ich immer. Okay. Es ist ganz witzig,
eben kam ein Student zu mir und fragte mich,
ob ich nach der Vorlesung ein bisschen über reguläre Ausdrücke reden könnte.
Da dachte ich so, hä? Das ist ja witzig
. Ich habe mir heute Morgen überlegt,
ich muss eigentlich in der Vorlesung über reguläre Ausdrücke reden,
weil wir sonst gar nicht mit unserem, mit unserem Enimal Service weiterkommen.
Das passt also wie die Faust aufs Auge.
Wir werden heute ein bisschen über reguläre Ausdrücke reden
Sehr schön,
dass es für später vielleicht nochmal eine ganz kurze Erinnerung,
was wir eigentlich vor zwei Wochen gemacht haben,
ist ja schon ein bisschen her, dass ich hier war.
Wir hatten also uns eine Software angeguckt,
wo man also hier irgendwelche Tiernamen eingeben konnte,
Oh, ich bin nicht im Netz. Das passt eigentlich super,
weil das Thema war ja Acceptions. Wir haben also gemerkt,
wir sind nicht im Internet, das Programm soll nicht abstürzen,
sondern das Programm soll wie eine sinnvolle, ein sinnvolles Feedback,
den Benutzer geben, was das Problem ist.
Und dann beheben wir mal als Benutzer das Problem.
Und hoffen wir, dass wir jetzt die Internetverbindung haben.
Haben wir nicht, habe ich mich wahrscheinlich vertippt.
Das ist so eins dieser Horrorszenarien, die ich habe,
dass ich meinen Pass oh.
Dass ich mein Passwort vergesse und hier nicht mehr ins Internet
komme.
Ja. Oh. Puh, okay. Bei Britt mal klappt es dann.
Okay, habe ich jetzt wieder eine Verdung im Internet?
Ja, sehr gut. Und ich wollte an diesem Projekt mit euch weiterschrauben.
Ich hätte auch theoretisch die Stacks wieder rausholen können,
aber irgendwie hatte ich den Eindruck,
diese Animal Farm macht doch irgendwie ein bisschen mehr Spaß als die Stacks.
Ja, ich hatte mir aber auch zu Hause Gedanken gemacht,
was mache ich denn jetzt,
wenn ich hier irgendwie mein Passwort vergesse oder wenn das Internet
hier generell down ist oder wenn Wikipedia down ist oder was auch immer.
Also vorsichtshalber ich mal, die hohen Wikipedia-Texte von fünf verschiedenen Tieren mir geholt,
falls also heute irgendwie es zur absoluten Katastrophe kommt,
können wir trotzdem weiterarbeiten.
Und dann müssen wir auch nicht immer Wikipedia so belasten mit ständigen Anfragen,
was eigentlich eine Katze oder ein Hund ist.
Gut, vielleicht schauen wir uns noch mal ganz kurz an,
wie dies rohe Format von Wikipedia aussah.
Ich habe ja gesagt, das meiste davon brauchen wir gar nicht.
Ach, Eclipse unterstützt auch nicht Steuerung, Maus hat.
Ist das groß genug? Irgendwie nicht, ne?
Das kann man doch sicherlich größer stellen. Das ist jetzt
so die Frage, welches der richtige davon ist.
Java ist es ja nicht
Tja. Ich mache es wieder so. Ich tue es
in meinen Lieblingstext-Editor. Das dauert sonst jetzt zu lang.
Zack, da sind wir wieder, ne?
Genau. Also ich hatte letztes Mal gesagt, hier ist
ganz viel Kram, der uns eigentlich gar nicht interessiert.
Das haben wir also alles gedanklich weggeschmissen. Dann kam hier irgendwann
der erste Satz und dann hatten wir uns mit dem Problem beschäftigt,
diese ganzen Anführungszeichen zu entfernen, diese Referenzen zu entfernen.
Links auf andere Wikipedia-Seiten entfernen und so weiter. Das ist irgendwie
nur noch so ein englischer Satz übrig bleibt. Jetzt,
wenn man sich nochmal anguckt, was ich da programmiert habe,
Dann seht ihr hier das Wort Service.
Guido hat ja letzte Woche ein bisschen was erzählt zu den SE2-Entwurfsregeln.
Wir haben also auf der obersten Ebene,
haben wir die Werkzeuge, Werkzeuge können Services benutzen,
Services können Materialien benutzen und Materialien können Fachwerte benutzen und man kann
auch Ebenen überspringen und Ebenen können sich auch selbst benutzen.
Also Services können andere Services benutzen oder Werkzeuge, andere Werkzeuge. Okay,
und der Fokus der heutigen Vorlesung liegt auf Services und Materialien,
weil das in der Übung eben genauso ist.
Ihr sollt ja in der Übung euch überlegen,
brauche ich irgendwie ein eigenes Material,
um irgendwie so Vormerkungen mir merken zu können und wie integriere ich das so in den Verleihservice,
dass ich dann vernünftig vormerken kann und gewisse Randbedingungen dann gelten
Okay, also wollte ich mich sozusagen analog auf dieselben beiden Elementtypen
beschränken heute, Service und Material. Jetzt haben wir aber noch
gar keine Materialien. Und da habe ich mir überlegt,
naja, hier so eine Map von Strings, nach Strings,
das ist ja irgendwie sehr wenig fachlich irgendwie.
Ja, okay, also das ist irgendwie der Name
des Tiers und das ist irgendwie die Beschreibung des Tiers.
Vielleicht könnte man da ein eigenes Material erstellen für Tiere.
Und ich habe mal geschaut,
was liefert mir eigentlich Wikipedia noch so für Informationen,
die ich bis jetzt immer so radikal weggeschmissen habe.
Was ich zum Beispiel ganz interessant finde,
ist Folgendes
Ich bin kein Biologe so, aber es scheint da irgendwie
eine unheimlich komplizierte Begriffshierarchie zu geben, um Tiere einzuordnen in Kategorien.
Und das hier verstehe ich zum Beispiel. Ja, das bedeutet
so viel wie Säugetier. Wenn es irgendwelche Biologen hier gibt,
die mir widersprechen wollen, dürft ihr es gerne tun.
Aber mit meiner Brille sehe ich hier, das hat wohl irgendwas mit Säugetieren zu tun.
Okay, das ist also die Katze, Katzen sind Säugetiere.
Und wenn man sich zum Beispiel mal hier so ein Hai anguckt,
ich glaube, jetzt mache ich es mal direkt in den Clips,
da seht ihr, also das ist kein Säugetier,
sondern irgendwas anderes.
Ja, und zum Beispiel ein Skorpion ist auch kein Säugetier.
Ja, das ist Arach nie da,
das ist wahrscheinlich so Spinnentier oder sowas,
Nicht. Es geht doch Arak, ladet jemand von euch unter Aragnophobie?
Ja, also ich glaube, das hat was mit Spinnen zu tun.
Okay, genau, und was war das? Tja,
da kann ich mir jetzt keinen Reim drauf machen, was das so bedeuten könnte.
Vielleicht hat das was damit zu tun, wie die atmen oder so.
Ich weiß es nicht. Gut, und da hatte ich mir überlegt,
also technisch soll es um Materialien und Service gehen,
worum soll es irgendwie aus der Anwendersicht gehen?
Den Anwender interessiert jetzt noch nicht, dass das irgendwelche Services
oder Materialien gibt. Ich hatte mir überlegt,
vielleicht bauen wir das System so um oder erweitern es so,
dass man fragen kann, sag mal,
welche Zeugetiere kennst du eigentlich bis jetzt?
Wenn ich also eingebe, cat und dann holt er sich
die Beschreibung von Cat und Dog und Shark und Scorpion
Und dann sag ich, gib mir doch mal alle Säugetiere.
Das interessiert mich, welche Säugetiere momentan mit deiner Datenbank sind.
Dann würde ich gerne eine Auflistung haben, wo dann eben
nur Katze und Hund drin sind und nicht die anderen.
Das ist das, wo ich heute fachlich mit euch hin will.
Gut. Und dazu fände ich es eigentlich ganz sinnvoll,
wenn wir uns mal Gedanken darüber machen könnten,
wie sollte so ein Animal-Material aussehen, was für Eigenschaften wollen wir da ablegen?
Gehen wir mal wieder zurück zu meiner Katze. Genau.
Also in vielen Tieren steht auch noch so einfach ein ganz einfacher Name drin.
Der scheint aber nicht bei allen Tieren drin zu stehen.
Also wenn ich mir das mal hier angucke,
ah doch, es war nur in derselben Zeile,
deswegen habe ich das vorher übersehen.
Und ist das bei Skorpion auch
Ihr seht, die Autoren sind da immer nicht besonders konsistent.
Also hier ist zum Beispiel keine Lehrtaste zwischengleich und S,
hier ist das nicht in der eigenen Zeile,
sondern noch in der Zeile davor.
Puh, also wir wollen ja irgendwie im Text nach diesen Informationen suchen.
Hoffentlich legt uns das nicht zu viele Steine in den Weg.
Ich habe das auch nicht selber geändert, sondern das ist
wirklich von Wikipedia so. Okay, und wie ist es
bei der Katze und da ist es dann eben so?
Also ich fände es ganz gut, wenn wir diesen Namen
ablegen würden irgendwie, als Exemplarvariabler in unserem Animal.
Das ist das eine. Dann Bilder und so brauchen wir
alles nicht. Und wenn wir das dann noch ablegen würden,
ja, was heißt eigentlich klasse
Weiß ich nicht. Ich hoffe nicht, dass es einfach nur klasse heißt,
weil das bedeutet ja in der Objektantierung was völlig anderes.
Und dann würde ich eben gerne noch diesen ersten Satz ablegen,
den wir bis jetzt immer hier unten ausgegeben hatten.
Diesen hier quasi. Ja, wollen wir uns das
vielleicht mal so als kleine Design-Entscheidung mal schon mal aufschreiben?
Also wir brauchen irgendwelche, ich mache das jetzt mal
ziemlich pseudomäßig, wir brauchen irgendwie eine klasse Animal.
Ja, das war irgendwie ein Material sein. Und ich
brauche da drin sowas wie Name, Classics und vielleicht Discription.
So hatten wir das ja immer vorher genannt.
Dieser erste Satz aus Wikipedia. Diese drei Eigenschaften würde ich
gerne in meinem Material Animal drin haben.
Können wir eigentlich direkt mal bauen,
Ja. So, dann machen wir uns nochmal so
eine Klasse Enman. So. Wir wollten einen Namen haben.
Dann brauchen wir dieses Klasses und wir brauchten eine Beschreibung.
Und dann machen wir uns mal einen Konstruktor.
Wie so ein Animal initialisiert werden,
das macht immer unheimlich viel Spaß,
das hier alles nochmal hinzuschreiben
Aber das ist nun mal so in vielen Programmiersprachen.
So. Ja, Autokomplite, ja. So, das
erstmal als kleines Grundgerüst. Okay, und jetzt kommt so
ein schwierigerer Teil. Jetzt müssen wir uns jetzt überlegen,
wie wir denn diese Informationen hier aus dieser Textdatei rauskriegen.
Ja, und vielleicht machen wir mal als,
bevor wir das machen, schauen wir uns doch mal an,
wie bis jetzt dieser erste Satz
da rausgeholt wurde
Dieser hier, ne? Okay. Und dazu muss ich jetzt mal
ein bisschen weiter ausholen. Wir haben ja ein SE1,
letztes Semester, zum ersten Mal nicht über reguläre Ausdrücke geredet,
weil ich einfach festgestellt habe, reguläre Ausdrücke ist zwar ein interessantes Thema,
es wird aber in SE1 eigentlich überhaupt nicht mehr benutzt und
bis die Leute dann in SE2 die regulären auch so gebrauchen,
haben sie eigentlich schon wieder alles vergessen,
was wir denen erzählt haben im ersten Semester.
Also machen wir jetzt so einen kleinen Nachrückhus.
Ich habe ja heute ein bisschen Zeit, das ist ja
ganz angenehm, ich habe ja keinen Zeitdruck hatte.
Okay, dann schauen wir uns doch mal an,
wie das hier in der jetzigen Implementation,
wo da reguläre Ausdrücke verwendet werden
Und eigentlich muss ich noch weiter ausholen.
Das wollte ich noch machen, bevor die Kamera startete,
aber dann hatte ich auf einmal so viel Zeitdruck.
Das ist aber kein Problem. Ich mache ja kurz einfach
mal eine neue Klasse. Egal wie sie heißt.
Und ich wollte euch einfach mal fragen,
ob ihr eine Ahnung habt,
was dieses Programm auf die Konsole schreibt
True. Also wir haben hier irgendwie einen String.
Wir fragen, wie lange es ist. Und die Information,
wie lange es, wollen wir auf die Konsole schreiben.
Jetzt gibt es da verschiedene Möglichkeiten, was da rauskommen könnte.
Vielleicht ist da überhaupt kein Zeichen drin oder eins oder zwei oder drei
oder vielleicht auch vier, könnte man ja auch denken.
Und ich würde ganz gern, dass ihr euch mal vielleicht 10,
20 Sekunden überlegt, wie lang ist dieser String,
den ich da in Zeile 11 angegeben habe.
Wie lang ist der? Überlegt euch das doch mal.
Früher waren das immer so schöne Klausuraufgaben,
aber heutzutage machen wir ja keinen Multiple Choice mehr.
So, jetzt hatten, glaube ich,
alle genug Zeit, sich das zu überlegen.
Dann machen wir einfach mal eine Abstimmung.
Ganz klassisch mit Handheben. Wer glaubt,
dass die Länge null ist
Ja, so ungefähr zehn Leute. Wer glaubt,
dass da ein Zeichen drin ist? Ja, so vor
zwölf ungefähr. Ich mache das mal ganz kurz.
Ich glaube, dass es zwei Zeichen sind. Ich sehe
drei Hände. Wer glaubt, dass es drei Zeichen sind?
Da ging eine Hand ganz kurz hoch und dann wieder runter,
sagen wir 0,5. Wer glaubt, dass es vier Zeichen sind,
also Anführungszeichen, backslash in Anführungszeichen
sind ja
vier Zeichen
Einer. Habe ich da jemanden überzeugen können?
Toll. Okay. Ja, was glaube ich denn?
Ich glaube, es ist nur ein Zeichen. Schauen wir
mal. Ja, genau, es ist ein Zeichen.
Hä? Aber da sind doch zwei, also ich meine,
da ist doch ein Backstlash und ein Ende, das ist ja merkwürdig.
Okay, machen wir eine kleine Hilfsmethode vielleicht.
Die uns vielleicht mal die einzelnen Zeichen auf die Konsole schreibt,
sagen wir mal, mir fällt gerade nichts Sinnvolles ein.
Also ich will also über alle Zeichen rübergehen von diesem String,
das ist ja so ein Standardidium,
das kennt ihr ja mittlerweile auch,
ich gehe einfach über alle,
Über alle gültigen Positionen des Strings. Und wie will ich
das jetzt auf die Konsole schreiben, vielleicht an welcher Stelle ich gerade bin?
Doppelpunkt und dann vielleicht den Askicode oder so. Dafür mache ich mal,
wenn ich mal das Print F,
vielleicht kennt das auch der eine oder andere aus der Unix-Welt,
ich kann nur so sagen, ich will eine Zahl ausgeben,
dann soll ein Doppelpunkt kommen, dann soll eine Spitze,
Klammer aufkommen, dann soll noch eine Zahl kommen,
dann soll eine Spitze,
Klammer zukommen.
Und dann, ich glaube, in Java ist so der Zeilenumbruch,
wenn mir nicht alles täuscht.
Und die Zahl soll das I sein und der Askicode ist
ja quasi Char-Ed-Position
Ich glaube, das funktioniert so und Java noch nicht.
Aber das können wir gleich beheben, dann erkläre ich das.
So, ja, ich will also wissen,
aus welchen Zeichen besteht denn jetzt dieser String?
Ups, genau, damit habe ich gerechnet. Ja,
genau, das ist ja ein Charakter,
aber ich will ja eine Zahl ausgeben.
Wie kann ich denn aus einem Charakter ein In machen?
Ja. Hm, ein bisschen lauter einfach,
ich habe es akustisch nicht verstanden.
Genau, den Chards nur Intager Carsten, so,
ne?
Kann mir das irgendjemand erklären, was er jetzt hier auf der,
also die Null ist mir klar, die Null ist ja,
das ist Position null in dem Strength, da geht's ja immer los.
Warum steht die Szene 10? Ich hab doch hier nirgendwo
irgendwas hingeschrieben, was auf eine Zehen hindeuten würde, ja.
Das liegt ja daran, wie scharf gekauft ist,
dass es nämlich für die Schalke das eintritt, editieren.
Eins, ein spezieller Büro von der Zeilen. Aha.
Und das ist sozusagen durch dieses Lehrständige. Sehr gut,
also das Slash N steht für einen Zeilenumbruch und es wird
als ein einziges Zeichen repräsentiert, was sozusagen unsichtbar ist,
was man gar nicht sehen kann,
was den Code 10 hat
Was würde jetzt zum Beispiel passieren, wenn ich da A machen würde,
welchen Quote hat das A, weiß das irgendjemand auswendig?
97 höre ich, oder war das nur die Stimme in meinem Kopf? Ja. Okay,
aber was eben, was die Lektion ist, ist folgende,
in einem Stringliteral kann es, gibt es, ja,
wie soll ich sagen, besondere Folgen von Zeichen,
die für ein einziges Zeichen stehen.
Das ist, ja, das muss man einfach akzeptieren.
Warum ist das so? Wie würde ich denn sonst ein Zeichen,
um auch hinkriegen? Vielleicht, indem ich einfach Enter drücke,
ups, da ist der Clips zu schlau für mich,
da warnte mich, dass das keinen Sinn macht,
kriege ich das irgendwie hin,
ich will ja
Enter haben
So, ja, ne? Man könnte ja als Programmieranfänger
vielleicht denken, ich drücke einfach Enter mitten im String-Literal.
Das erlaubt die Sprache nicht. Ein String-Literal darf nicht über
mehrere Zeilen gehen. Okay, also ist das sozusagen eine Konvention,
wenn du ein Zeilen-Umbau haben willst, dann mach Backslash ein.
Okay. Dann gibt es noch so ein paar andere Escapes und
ein ganz wichtiger ist, wenn dieser Backslash jetzt was,
etwas einläutet, was was Besonderes ist.
Ja, wie kriege ich denn dann einen Backslash? Also ich will einen,
ich will den Backslash an sich auf die Konsole schreiben,
manchmal etwas helfer brauche ich jetzt vielleicht nicht mehr.
Ich will einen Backslash auf die Konsole schreiben.
Könnte man da vielleicht denken, okay, so,
fertig.
Warum geht das nicht
Ja. Beide wechseln uns da. Das bedeutet,
da passt man auf den Menschen.
Okay. Das heißt, man muss zwei Backstages schreiben.
Schauen wir, ob das funktioniert. Okay,
das ist eine der Hürden, über die ihr rüberkommen müsst,
um heute das Thema reguläre Ausdrücke zu verstehen.
Wenn ihr ein String haben wollt, wo ein Backstage drin ist,
dann müsst ihr im Java-String-Literal zwei Backslashers hinschreiben.
Das klingt erstmal ganz einfach, aber es wird gleich,
glaube ich, sehr lustig, wenn ihr diesen ganzen Backslashers in meinem Programm seht.
Okay, also dieser String hat die länger eins und es steht ein Backslash drin.
Okay, dann gehe ich jetzt wieder zurück zum Animal Service.
Und jetzt schauen wir uns mal an, wo wir reguläre Ausdrücke finden.
Aha, hier ist der erste. Und ich habe ja
sogar extra noch hier ein eigenes Projekt noch mal kurz.
Kann ich das nicht auch noch mal ganz kurz starten?
Genau, das ist ein Projekt,
das hatte ich mal für den SE1-Übungsbetrieb gebaut.
Da kann man also
reguläre Ausdrücke eingeben
Den gebe ich jetzt hier einfach mal ein, sagen wir mal.
So, ne? Genau. Und ihr seht,
dass dieses Tool schon eine enorme Vereinfachung dem Anwender bietet.
Er muss über diese doppelten Backslashes sich keine Gedanken machen.
Ich kann also hier oben eine Zeichenkette eingeben,
so wie ich sie als Mensch meine.
Und dann sieht man hier unten das entsprechende Literal,
was ich verwenden müsste, wenn ich das in meinem Java-Code verwenden will.
Ihr seht also, der macht aus diesem einen Backslash
automatisch zwei und fügt diese Anführungsstriche hinzu.
Okay. Kleiner didaktischer Einwurf. Ich benutze die ganze Zeit
hier das Wort reguläre Ausdruck und habe noch kein Wort darüber
verloren,
was das überhaupt ist
So als wäre das irgendwie etwas,
was zum Grundrepertoire eines Informatikers gehört und ich erwarte einfach,
dass ihr wisst, was es ist,
das kann ich natürlich nicht machen.
Okay. Und dieses Tool soll einem helfen, reguläre Ausdrücke zu verstehen.
Was ist ein regulärer Ausdruck? Also, ein regulärer Ausdruck
ist eine Zeichenkette, in diesem Beispiel Backslash S plus plus.
Und diese Zeichenkette beschreibt eine Menge von Zeichenketten. Ja,
ich kann da so sagen, zum Beispiel hier unten,
wenn ich jetzt hier zum Beispiel mal so ein paar leertassen,
seht ihr,
dass ich hier Leertasten eingebe
Und das Programm sagt, alles ist in Ordnung.
Wenn ich das erste Mal keine Leertaste eingebe,
sagt das Programm, eh rot, sozusagen dieser String,
den ich unten eingegeben habe, gehört nicht zu der Menge von Zeichenketten,
die durch diesen regulären Ausdruck beschrieben sind.
Kann mir ein regulärer Ausdruck, Experte sagen,
was dieser reguläre Ausdruck bedeutet, Backslash S plus plus.
Ja, du hattest heute schon mal was gesagt, sonst keiner.
Man hat doch sonst immer die Unix-Experten im Raum,
ist das eine halbe Meldung?
Nee. Oder doch? Ja
Das ist ein Eivers. Ja, und was bedeutet
slash as? So viel wie Leerzeichen oder White Spaces.
Es könnte auch ein Tabulator oder ein Zeilenumbau oder so sein.
Okay. Das heißt, dieser reguläre Ausdruck sagt,
ich akzeptiere beliebig viele Leerzeichen, aber nichts anderes.
Ja, also dieses Backslash as bedeutet Leerzeichen.
Und dieses Plus Plus müsst ihr mir jetzt einfach mal glauben,
bedeutet mindestens eins, aber es können so viele sein,
wie du willst.
Das heißt, wenn ich jetzt hier mal alle wegnehme,
dann seht ihr, es ist rot,
weil es ist ja nicht mindestens eins.
Während wenn ich mindestens eins hinschreibe,
dann wird es
wieder akzeptiert
Okay. Wo benutzen wir denn dieses Backslash S-Plus Plus?
Das ist ja hier dieses Patton. Ah, hier.
Genau. Das ist also der erste sinnvolle Anwendungsfall. Ich starte nochmal
das eigentliche Programm und zeige euch, was der Anwendungsfall dafür war.
Wenn ich hier zum Beispiel eingebe, wir hatten doch letztens,
in der Honeybagger war das letztes Mal, ne?
Genau. Dann würde das normalerweise nicht funktionieren, weil man
keine Leertasten in URLs drin haben kann. Ihr könnt nicht sagen Wikipedia,
hey, www.wkipedia irgendwas und dann irgendwie Title gleich,
Honey, Leertaste, Batcher, das geht nicht,
sondern ihr müsst aus diesen ganzen Leertasten
Unterstriche machen
Ja, und das wird hier gemacht. Ich sage also,
diesem regulären Ausdruck sage ich, pass auf,
ich gebe dir den Tiernamen rein und ersetzt doch jetzt mal bitte alle,
ja, Vorkommen von Lettasten durch Unterstriche.
Ja, und das ist eigentlich so, ja,
der einfachste, sinnvolle Anwendungsfall von regulären Ausdrücken.
Finde mir, wie lieb ich lange Zeichen,
oder beliebig lange Leerzeichenketten, und ersetzte sie durch einen Unterstrich.
Ja, das heißt, es würde auch gehen,
wenn ich hier mehr als eine Leertaste mache.
Also zum Beispiel Honey, 1, 2, 3,
4, 5 Batcher. Ja, das würde genauso gehen.
Er würde es dann aber trotzdem nur durch ein einzelnes,
durch einen einzelnen Unterstrich ersetzen
Okay. Gibt es noch Fragen zu diesem regulären Ausdruck,
der sagt, ich beschreibe eine unendlich große Anzahl von Zeichenketten,
die dadurch gekennzeichnet sind,
dass sie mindestens aus einer Leertaste bestehen,
können aber auch mehr als eine sein.
Das bedeutet das. Nee? Okay, dann schauen wir
mal, ob es jetzt vielleicht ein bisschen komplizierter wird.
Wollen wir den nächsten? Oh, oh Gott.
Ja. Dann muss ich euch einmal zeigen,
was ich mir dabei gedacht habe,
wo ist jemand Consult Wikipedia,
muss ich ja nochmal
den Text zeigen
Also, da war ja das Anwendungsbeispiel, was ist,
wenn ich noch Kuh suche? Und dann ist, das ist das,
was Wikipedia mir jetzt zurückliefert, wenn ich nach Kuh suche,
das kopiere ich mir auch noch mal kurz ins dableibenden Text rein.
Hallo? Ja, das kommt da zurück.
Und das möchte ich erkennen. Ich möchte erkennen,
wenn mir Wikipedia sowas zurückliefert und ihr könnt euch vielleicht vorstellen,
ich habe das jetzt nicht recherchiert,
sondern ich habe mir das einfach angeguckt und mir überlegt,
naja gut, also offenbar steht immer dieser String am Anfang von einem Artikel,
der einen weiterleitet auf einen anderen Artikel.
Ja, dann kommen zwei solcher öffnenden eckigen Klammern.
Dann kommt der Artikel, zu dem man weitergeleitet wird.
Und dann kommen schließende Klammern und dann kommt noch irgendein Unsinn,
den ich nicht verstehe und der mich auch nicht interessiert,
weil für alle Beispiele, bei denen ich es probiert habe,
hat es geklappt, indem ich mich hier auch beschränkt habe.
Hier haben wir also wieder eigentlich einen idealen Anwendungsfall für reguläre Ausdrücke.
Ich habe diese Brille auf, ich brauche erst dieses Redirect,
dann zwei öffnende Klammern, dann irgendwie ein Wort,
so und dann zwei schließende Klammern und danach irgendwas,
was mich nicht interessiert.
Dazu gibt es doch sicherlich auch einen regulären Ausdruck. Natürlich,
den habe ich ja hier, das werde ich jetzt mal so darüber halten,
ob es zu viele Fenster auf einmal offen So.
Und wo ist jetzt dieser reguläre Ausdruck? Hier. Okay,
das heißt also, ich kann in so einem regulären Ausdruck erstmal eins zu eins Zeichen hinschreiben,
die ich so eins zu eins eben erkennen will.
Ja, also diese Raute hat überhaupt keine besondere Bedeutung in regulären Ausdrücken.
Also am Anfang muss dieses Reader Red gehen, das passt.
So, und jetzt, ja, jetzt wird es lustig.
Jetzt komme ich zu dieser Backslash-Geschichte. Ich kann jetzt nicht einfach nur schreiben,
eckige Klammer auf, weil die eckige Klammer auf hat bei regulären Ausdruck eine besondere Bedeutung.
Das werden wir später noch sehen. Ich muss jetzt also diesem Rack-Ex-System klar machen,
ich brauche oder ich suche nach einer Klammer auf,
Und ich muss sie mit einem Backslash davor escapen,
weil er sonst denkt, ach,
du meinst diese besondere Klammer auf,
die in regulären Ausdrücken eine besondere Bedeutung hat.
Und die eine Million Dollar-Frage ist jetzt,
warum muss ich denn jetzt hier zwei Ausrufe,
zwei Backslashes davor schreiben, warum steht da nicht nur ein Backslash?
Ja, ich lasse mal kurz die Leute darüber nachdenken,
weil das ist das, wo die meisten dann verlassen werden und denken,
hä, ich sehe nicht mehr das System dahinter,
das wirkt alles so zufällig.
Du hast
noch nichts gesagt
Wechselst. Er vereinert sich, er wird uns zweifeln.
Okay, also da steckst du schon ganz gut,
was entgeht jetzt noch ein bisschen prägnanter vielleicht, ja?
Ja, wenn man eigentlich jetzt das Thema,
das ist ja auch vielleicht besonders zeitlich. Genau,
man könnte uns fragen, was würde es bedeuten,
wenn da nur ein bester Stunde, wir können das ja mal ausprobieren.
Jetzt sagt mir Java, pass auf,
du hast hier ein Stringliteral, ja?
Es gibt so ein paar Sonderzeichen, die ich erlaube,
Backslash N, Backslash,
Backslash und Backslash
Anführungszeichen,
glaube ich
Warum willst du denn einen Backslash vor eine eckige Klammer auftun?
Die eckige Klammer auf, hat doch in Java-Strinks überhaupt keine besondere Bedeutung.
Das würde keinen Sinn machen. Man muss sich also
die Frage überlegen, wann werden diese Backslashes interpretiert?
Also diese Backslashes werden zu einem Backslash verschmolzen, wenn das Programm übersetzt wird.
Wenn der Compiler sagt, hier ist der Quelltext, oh,
hier ist ein String-Diterei, welcher Strings sind damit gemeint?
Diesen String muss ich ja irgendwie in meine Class-Datei reinbacken.
Also quasi, ja, ich meine, ihr müsst den
nicht auf Übersetzung drücken. Wenn ihr bei BlueJay auf Übersetzung drückt,
dann werden auf diesen beiden Backslash schon, wird einer gemacht.
Und erst zur Laufzeit Wenn diese Methode aufgerufen wird, ja,
schaut sich diese Methode den String an und sieht dann,
Raute, Redirect, sieht eine Leertaste, sieht einen Backslash.
Denn zur Laufzeit ist da ja nur noch ein Backslash.
Und sieht dann diese Klammer und versteht, ah klar,
Backslash, eckige Klammer auf heißt, er sucht nach einer eckigen Klammer auf.
Ja, das ist eigentlich so das Schwierige an regulären Ausdrücken.
Und eigentlich ist das nur so eine technische Randerscheinung,
die eigentlich gar nichts damit zu tun hat.
Okay. Okay, also,
wenn ihr in einem regulären Ausdruck nach einer eckigen Klammer aufsuchen wollt,
müsst ihr zwei Backslashes davor schreiben.
Okay, dann wollen wir noch eine eckige Klammer aufhaben.
Das heißt, wir sind jetzt
quasi bis hier gekommen
Ja, und jetzt kann ich ja nicht einfach nur Kettle da reinschreiben,
denn ich will ja alle Wörter sozusagen darin erlauben.
Ich will eigentlich alles Mögliche darin erlauben,
bis ich zu dieser schließenden Klammer komme, hups.
Und das mache ich hier. Ja,
wo fangen wir denn mal an, das zu erklären?
Vielleicht hier. Was bedeutet dieser teilreguläre Ausdruck? Diese
eckigen Klammern sind jetzt tatsächlich eckige Klammern des regulären Ausdrucks.
Wenn ich etwas in eckige Klammern schreibe,
vielleicht erstmal ein einfaches Beispiel, ihr seht,
das ist ein unheimlich kompliziertes Thema.
Eigentlich hätte ich am liebsten die ganze Vorlesung heute dafür.
Machen wir wieder
ein Beispiel
So, also ich kann hier oben in Klammern zum Beispiel
schreiben, Ö-A, B, C, plus plus.
Ja, das bedeutet,
ich möchte entweder ein A oder ein B oder ein C
haben und ich will mich beliebig oft dazwischen entscheiden können.
Also es sollen beliebig viele von diesen ASBs und Cs sein,
aber mindestens eins. Ja, also ich lösche das jetzt mal.
Noch sind es zu wenig, schön, das kann ich zum Beispiel sagen.
C. A, B, B, A, B,
C, C, A, B. Ja,
und wenn ich jetzt D sage,
dann gehört es nicht mehr zu dieser Menge von Zeichenketten,
die durch den regulären Ausdruck beschrieben sind
Also beliebig viele ASBs oder Cs. Es muss aber nicht immer
derselbe Buchstabe sein, sondern ich kann mich jedes Mal frisch neu entscheiden.
Okay. Jetzt habt ihr also verstanden,
wozu diese Ecke in Klammern in regulären Ausdrücken normalerweise sind.
Okay. Ich kann aber auch sagen, ich will
alle Zeichen erlauben, die nicht AB oder C sind.
Und dann tut man aus dem Dach davor. Ach Gott,
ach Gott, jetzt weiß ich gar nicht,
wo dieses Dach auf meiner Tastatur ist.
Das ist hier. Ein Zurkonflex. Dankeschön. Hier haben
wir, das ist für Comflex. Und jetzt wird alles
erlaubt, was nicht ABC ist. Und jetzt mache ich
mal ein A und schon ist es nicht mehr zulässig
Das bedeutet es also. Also wenn ihr immer etwas seht,
in so eckigen Klammern, mit einem Zirkumflex davor oder Cornflakes,
nee, Sir Cornflakes habe ich, glaube ich,
immer früher in der Schule genannt, genau.
Dann ist alles erlaubt, was nicht dahinter steht.
Okay? Schauen wir uns das hier wieder an.
Wo ist hier mein konkreter Anwendungsfall? Hier. Kann mir
jetzt jemand mit dem Wissen sagen, was dieser Teilausdruck bedeutet,
da sind ja schon wieder mehrere Ebenen, von mir sturt es heute noch nichts.
Ja, ich glaube, das heißt,
was ich da auch alles ausgeben soll,
was keine Ebenen Genau, er soll also immer weiter scannen,
solange er keine eckige Klammer zugefunden hat.
Ja, also nochmal ganz kurz,
diese eckige Klammer aufgehört zu dieser eckigen Klammer zu.
Ich sage also, ich beschreibe jetzt erlaubte Zeichen.
Dieses Zirkonflex sagt, es ist eigentlich alles erlaubt,
nur nicht das, was als nächstes kommt, nämlich das hier.
Und das ist ja die eckige Klammer zu.
Ah, okay. Ihr seht schon reguläre Ausdrücke,
kann man eigentlich gar nicht lesen. Am besten jedes Mal,
wenn ihr einen regulären Ausdruck ändern muss,
fangt am besten bei null an,
weil bis man den verstanden hat.
Gut. Also nochmal ganz kurz von vorne,
eine eckige Klammer auf, noch eine eckige Klammer auf,
dann, ja, quasi beliebig viele Zeichen,
die nicht eine eckige Klammer zu sind
, dann eine eckige Klammer zu und dann eine eckige Klammer zu.
Okay. Wo sind wir denn dann angekommen? Hier, ne?
Dann haben wir quasi die Eingabe bis hier gepasst und dann sage ich noch dahinter,
kann kommen, was ich will, das interessiert mich nicht,
dann schreibt man das einfach so.
Der Punkt steht für, es ist im Prinzip irgendwelche Zeichen,
ist mir völlig egal, also irgendein Zeichen und der Stern dahinter sagt,
es können beliebig viele sein, null oder ein oder zwei oder drei, ist mir egal.
Und jetzt kommt noch eine Besonderheit, Ich habe jetzt dieses,
was ja hier für dieses Kettle steht, das habe ich nochmal in runde Klammern getan.
Und runde Klammern haben in regulären Ausdrücken auch wieder eine besondere Bedeutung.
Das Interessante ist, wenn ich etwas in Runde Klammern tue,
dann kann ich da von außen rankommen. Ich kann also sagen,
wenn es sich tatsächlich um so ein String handelt,
was ist denn die relevante Information, die ich haben will?
Es ist ja dieses Kettle. Es interessiert mich nicht davor,
dass es davor tatsächlich,
also ich müsste niemals irgendwie an diesen String rankommen oder an irgendwas,
was da draußen ist, sondern ich will wissen,
ja welches Wort war es denn jetzt, was du hier gelesen hast.
Und das kann ich damit machen. Wie gesagt,
ich mache solche Runden Klammern darum, Und da kann ich sagen,
gib mir doch mal die erste Gruppe, ja,
solche Klammern, solche Runden, klammern bilden Gruppen.
Und da gibt man mir genau den String zurück,
der da in diesen virtuellen Rundenklammern sozusagen drin stand.
Ja, das heißt, in diesem Fall werde ich das Kettle zurückbekommen.
Gut. Puh, das war ganz schön kompliziert, oder?
Ja, gibt es hierzu zu diesem regulären auch so Umfragen,
ja. Aber mit jetzt bei den Gruppen,
jetzt plötzlich sind wir im Index eins.
Das ist eine gute Frage. Normalerweise fängt man ja immer
mit dem Index 0 an in der Informatik.
Es gibt eine unsichtbare, implizite Gruppe 0,
die für alles steht, was gepasst wurde.
Also sozusagen von dieser Raute bis hier,
das wäre Gruppe
Die ist einfach immer da. Ja. Okay. Gut,
aber ihr seht, das reguläre Ausdruck, wir sind ein tolles Tool,
um solche Texte auseinanderzunehmen und sich da Informationen daraus zu extrahieren.
Ohne reguläre Ausdrücke wurde es noch viel furchtbarer aussehen.
Ja, dann würdet ihr wahrscheinlich 100 Zeilen Quelltext scheinen müssen
mit irgendwelchen Schleifen und Yves und so.
Gut, es ist also eine sehr kompakte, aber auch recht mächtige Notition.
Okay, wo ist der nächste reguläre Ausdruck?
Ah hier, das ist einfach. Hier ging es darum,
dass sich diese ganzen Anführungszeichen nicht haben will.
Schauen wir uns das nochmal ganz kurz an.
Habe ich das hier noch irgendwo hier, ne?
Ja, genau. Diese Anführungszeichen will ich nicht haben.
Und die auch nicht, diese drei nicht und diese zwei
will ich auch nicht haben.
Und diese zwei will ich auch nicht haben
Und die werden eben durch diesen regulären auch so bestimmt.
Der ist wirklich einfach,
den spreche ich mir nochmal ganz kurz in mein Tool rein.
Doch, ich habe es wieso schließe ich mein Tool immer.
Ich bin aber auch einer. Muss ich schon wieder starten.
Nein, Applets sind aus den 90ern. Also dieser reguläre Ausdruck.
Hat hier mal eine Idee oder weiß es vielleicht auch,
was das bedeuten hat. Also Hochkomma, das scheint ja
irgendwie das Zeichen zu sein, was uns interessiert.
Und jetzt komme ich schon wieder irgendwie so besondere Klammern.
Die scheinen ja schon wieder eine besondere Bedeutung zu haben.
Was könnte das bedeuten? Geschweifte Klammer auf, 2,
geschweifte Klammer zu. Ich meine, so eine Ahnung
Also wenn da eins so ein Hochkammer ist, interessiert mich das ja nicht.
Das könnte ja sowas sein wie Thats oder Its oder so.
Das könnte jetzt dieses 2-Komma angeschweifen klammern, oder?
Keine noch eine Idee? Ja, da. Ja,
also man gibt die Anzahl in geschweiften Klammern an, genau.
Jetzt sagst du mehr als zwei. Größter gleich zwei,
sehr gut. Also ich kann sagen, wie viel sollen
es mindestens sein und wie viel soll es höchstens sein?
Ich könnte ja auch zum Beispiel fünf hinschreiben.
Und wenn ich jetzt hier mal so eine Beispieleingabe mache,
zum Beispiel eins reicht nicht, zwei ist in Ordnung,
Drei, vier, fünf ist auch in Ordnung.
Und sechs wäre dann schon wieder zu viel. Aber in meinem Beispiel sage ich,
wenn es eine Folge ist, von mindestens zwei Hochkommentar,
dann ist es etwas, was mich interessiert.
So, jetzt schließe ich es mal nicht, sondern mache es
nur klang. Okay. Das haben wir also hier.
Und wo verwenden wir das? Ich sage also hier,
dass ich es irgendwie nicht extrahieren will, sondern ich will es ersetzen.
Das hatten wir oben auch schon. Ich will es einfach
durch gar nichts ersetzen. Okay. So, ich glaube,
den letzten sparen wir uns, weil der wird irgendwie noch komplizierter.
Ich glaube, ihr habt jetzt die Elemente von regulären Ausdrücken,
die wir brauchen, um jetzt unsere Aufgabe zu lösen.
Habt ihr jetzt, glaube ich,
Gehen wir mal zu unserer Aufgabe zurück. Das ist jetzt vielleicht
schon so lange her, dass ihr euch gar nicht mehr erinnert,
was wollten wir denn eigentlich machen? Wir wollten ja,
diese Informationen uns raus extrahieren, aus dem hohen Wikipedia-Text.
Und diese Information. Sieht jemand ein Muster, was irgendwie beschreibt,
ich suche nach den und den konstanten Zeichen und dann kommt dahinter
irgendwas anderes und dann und irgendwann ist es dann vorbei oder so.
Das ist, glaube ich, hier schon gar nicht
so trivial, weil hier gerade eine Lehrtaste dran ist.
Warum vielleicht erstmal mit irgendwas testen, wo keine Lehrtaste drin ist?
Wie ist es, das ist, glaube ich,
Domestic Dog, da ist es,
glaube ich,
Habe ich da überall erlebt hast. Ah, hier zum Beispiel nicht.
Gerade das ist nicht glatt von Anfang an so schwer ist.
Also seht ihr irgendwie, dass es hier irgendwie Gemeinsamkeiten gibt,
nach denen man suchen kann und wo man dann ein bisschen abstrakter suchen muss.
Also ich will ja zum Beispiel nicht nach Kettle suchen.
Aber nach was will ich denn hart suchen und was für
Zeichen stehen dann so in der Nähe und was kommt dann
hinter dem Bekanntenzeichen?
Genau, ne? Also gut,
vielleicht schreiben wir uns das nochmal ganz kurz auf Deutsch auf,
weil wir vielleicht noch nicht so fit sind mit regulären Ausdrücken.
Also, wonach suchen wir? Du hast gesagt,
wir suchen nach einem, ja, wie nennt man das Ding,
Pipe nenne ich es immer, ich weiß gar nicht,
wie das auf Deutsch heißt, Senkrechtstrich, Senk,
Senkrechtstrich, ja, ups, das ist dieses Zeichen,
nachdem suchen wir.
Jetzt ist die Frage, muss dahinter eine Lehrtaste kommen?
Das ist eine interessante Frage. Schauen wir uns mal
weitere Beispiele an. Da ist eine Lehrtaste. Okay,
also hier ist, ne, hier,
da ist auch eine Lehrtaste
Guck mal, hier ist es zum Beispiel keine Leertaste.
Also sollten wir diese Leertaste vielleicht optional machen, oder?
Also sagen wir vielleicht mal, wir sind mal vorsichtig,
wir sagen mal beliebig viele Leertasten.
Wer weiß, auch wenn nicht mal irgendjemand mehr als einer
reingemacht hat und dann würde es nicht mehr funktionieren.
Okay, wo ist denn jetzt mein Name?
Da. Dann der String Name. Ich hoffe, dass
das immer in kleinen Buchstaben ist. Ich weiß nicht,
ob Wikipedia da auch mehr erlaubt,
vielleicht können wir uns da später nochmal ein To-do hinschreiben,
To-do, auch groß erlauben.
Weiß ich nicht. So. Okay, und dann hattest du
gesagt,
nochmal beliebig viele Leertasten
The Whops? Dann kommt das gleiche Zeichen.
Dann vielleicht nochmal Vorsichtshabe, bin liebig, viele Leertasten.
So, und ja, was kommt dann?
Was ist das, was dahinter steht? Ja. Ja,
und wie ist die Beschreibung eines regulären Ausdrucks, wo ich sage,
ja, im Prinzip beliebig viele Buchstaben oder so.
Weiß das jemand? Wie man das, ja
B. Ich glaube, dass das W, ja, W klingt ganz gut.
Okay. Also sagen wir hier mal beliebig viele Buchstaben.
So, ne? Okay. Und jetzt übersetzen wir das
mal ganz kurz in reguläre Ausdrücke. Also dieses Pipe-Symbol ist
ja nichts Besonderes, das schreibe ich einfach hin.
Beliebig viele Lehrtasten. Wie sage ich das denn? Erinnert euch
noch jemand? Ja. Es hatte was mit dem Plus-Plus
zu tun, aber was muss vor dem Plus-Plus stehen?
Ja? Genau. Dann, ja,
das Wort Name schreibe ich einfach so hin,
das ist klar,
das ist wieder dasselbe
Das gleiche Zeichen hat auch keine besondere Bedeutung an regulären Ausdrücken,
das muss ich also nicht irgendwie escapen,
Leertasten hatten wir auch schon mal, so beliebig viele Buchstaben,
da hatte jetzt ja der Herr gesagt, so,
oder?
Wechselless W, war das das, was du gesagt hattest?
Es gibt kein Widerwort, dann nehme ich das einfach mal als Akzeptanz.
Dann kleben wir uns das mal zusammen. Okay, Palp
, dann kommt das. So, ja. Richtig,
ich hatte ja gesagt, wir fangen erstmal mit der Kuh an.
Und wenn das mit der Kuh funktioniert,
dann überlegen wir uns,
was wir danach machen
Damit es auch mit Hunden funktioniert. Die Leertasten in der Beschreibung
haben. So, bis wo war ich jetzt gekommen?
Gleichheitszeit und das hier, ne? So,
das ist also der reguläre Ausdruck,
den wir uns jetzt zusammen überlegt haben,
mit denen man diese Information finden müsste, wie laut Wikipedia das Tier heißt.
Okay, kopiere ich mir das mal? Ja,
und jetzt ist die Frage, wie wir das jetzt in
unser System einbauen. Schauen wir uns mal ganz kurz an,
in welchen Schritten hier der Text verarbeitet wird.
Und da müssen wir uns wahrscheinlich Gedanken machen,
dass wir die Schritte so ein bisschen umordnen wahrscheinlich.
Also wir müssen sicherlich immer noch als allererstes Wikipedia fragen,
gib mir mal den rohen Text.
Das hat keinen Sinn, vorher was anderes zu tun.
Dann kommen diese Redirects, das ist auch klar,
das muss man auch als erstes machen,
sonst hat man ja gar keine sinnvollen ersten Informationen.
Jetzt mache ich mir einen Zeilenumbruch rein. So,
das ist jetzt die Parkplan, die wir bis jetzt immer gefahren sind.
Wir haben als allererstes alles weggeschmissen, was in diesen geschweiften Klammern drin stand.
Schauen wir uns mal kurz an, was das war.
Habe ich hier nochmal irgendwo das Beispiel hier.
Wir haben also am Anfang gesagt, alles von hier
bis hier schmeißen wir mal im allerersten Schritt weg.
Das wäre jetzt ja
irgendwie schlecht
Dann würde der ja alles wegschmeißen, was wir
uns gerade holen wollten. Also er würde das hier,
wäre dann verloren und das hier wäre dann auch verloren.
Das wäre irgendwie blöd. Also könnten wir uns überlegen,
lass uns doch, bevor wir diese ganzen Klammern wegschmeißen,
als allererstes nach diesen Strings suchen.
Hier oben wird das wunderbar funktionieren. Hier unten wird es
nicht ganz so den gewünschten Effekt haben. Warum nicht?
Wir haben jetzt den Regulären auch so für unten noch nicht geschrieben,
aber ihr könnt mir glauben, hörst auf,
dass da Stadtnahme dann klassisch steht,
wird es ja im Prinzip dasselbe sein
Dann wurde er also irgendwie sagen, okay,
hier steht das Klasse, hier steht die Leertaste.
Und jetzt erwarte ich ja beliebig viele Buchstaben. Das hier ist aber
kein Buchstabe. Was bedeuten denn jetzt diese eckigen Klammern?
Das sind ja nochmal andere, als die in den regulären Ausdrücken.
Das sind jetzt ja Wikipedia-eckige Klammern. Ihr seht,
wir sind ja in ganz vielen verschiedenen Ebenen und überall
bedeuten die Klammern was anderes.
Furchtbar. Aber so ist das nun mal in der Informatik.
Hat irgendjemand von euch eine Idee,
was diese Klammern bedeuten?
Richtig, ein Link auf einen Artikel, der so heißt.
Das hat einfach den Sinn, dass ich innerhalb von Wikipedia
da raufklicken kann und dann lande ich bei den Säugetieren.
Und diese Links entferne ich in meinem Programm.
Schauen wir uns das nochmal ganz kurz an. Das tue
ich hier. Hier suche ich also nach diesen Links,
ihr seht, ich suche hier nach diesen geschwaffenen Klammern,
ich gucke mir diesen furchtbaren Ausdruck gar nicht an,
der ist schlimm, aber es ist dasselbe Prinzip wie oben.
Und ich ersetze es dann einfach durch das, was in dem Link drinsteht.
Okay, das heißt, das müssen wir einfach nur vorher machen.
Wenn ich das also vorher mache, wenn ich sage,
als allererstes kümmere ich mich darum,
diese Links zu entfernen, dann wird hier Sowas stehen.
Und das will ich ja. Das sieht schon viel besser
aus. Also würde ich mal vorschlagen, dass wir das entfernen
dieser geschweiften Klammern so weit nach unten wie möglich tun.
Ach hier, kurz überlegen. Ja, weil,
richtig, weil das Retain first sentance verlässt sich darauf,
dass diese geschweiften Kammern nicht mehr da sind, sonst bekomme ich da Unsinn.
Okay. Gut, das heißt, hier fehlt jetzt noch
ein Schritt. Hier fehlt jetzt der Schritt. Er sagt,
ich habe jetzt einen Ausgangszustand, wo das hier alles entfernt wurde,
das ist also alles diese ganzen Sonderzeichen, sind weg.
Diese Kommentare sind möglicherweise alle weg, diese ganzen,
was weiß ich, sowas wird möglicherweise auch wechseln,
ich bin mir nicht 100% sicher, wie weit ich das getrieben habe.
Wo ich jetzt vernünftig danach suchen kann. An der Stelle
können wir jetzt also mal nach den Informationen schön suchen.
Toll, machen wir das doch mal. So, wie
wollen wir das mal nennen? Detekt, Name and Klassisch,
könnten wir das schon mal nennen, oder?
Gut, müssen wir diese Methode nicht durchschreiben.
Ich tue sie mal möglichst weit nach oben,
dann muss ich immer danach, muss ich nicht immer danach suchen.
Nee, er versteht nicht, dass diese Methode sinnvoll ist,
wir techten eng an Klassisch
So. Okay, die Ausgangssituation ist also,
in dieser Variable Description steht jetzt dieser bereinigte Text,
die geschweiften Klammern sind noch drin und ich suche jetzt mit Hilfe der regulären Ausdrücke,
die wir uns gerade überlegt haben,
suche ich jetzt einfach mal danach.
Also machen wir zuerst mit den regulären Ausdruck.
Wie macht man sowas denn? Wir orientieren uns einfach an
dem Beispiel, was hier schon ist.
Kopiere ich mir einfach einmal. Und nenne das jetzt mal
Names. Okay? Und da kommt jetzt der reguläre Ausdruck,
in den wir uns zusammen überlebt hatten.
Der war ja, wo haben wir hingeschrieben?
Hier, oder? Genau, da ist er.
Das ist der reguläre Ausdruck, der diese Names-Einträge beschreibt
Jetzt muss ich hier natürlich die Backslashes noch escapen,
weil ich jetzt in einem Stringliteral drin bin.
So. Okay. Gut. Und jetzt kann ich danach suchen
. Wo habe ich denn mal danach gesucht?
Das habe ich jetzt zum Beispiel bei diesen Links gemacht.
Vielleicht orientiere ich mich dann mal danach, wo habe ich
diese Links aufgelöst? Hier. Nee. Nee,
ich will ja da rankommen, die Information hier,
ne?
Genau, also
Ja, ich muss ja erst mal,
ich kopiere mal einmal ganz kurz die ganze Methode,
sonst muss ich hier zu viel von Hand tippen.
Ich glaube, ich hatte unten irgendeinen Trick verwendet,
den ich oben nicht verwenden kann.
Also, wir müssen uns erst mal so einen Metcher holen.
Also, ich sage diesen Names, gib mir doch mal einen Metcher.
Okay. Du sollst matchen auf die aktuelle Description,
also schau sie dir an. So,
und das tun wir jetzt mal unseren eigenen Matcher rein.
So, okay. Ich habe jetzt also einen Metcher,
der sich diese Description anguckt und schaut,
ob die auf diesen regulären Ausdruck irgendwie
eine Entsprechung findet
Beziehungsweise ja, wie suche ich denn jetzt danach?
Das wäre quasi das hier, ne? Und was wir noch nicht gemacht haben,
ist die Information, die uns ja eigentlich interessiert,
die müssen wir jetzt in so eine Gruppenklammer packen,
damit er versteht, dass das die Information ist,
die wir letzten Endes daraus extrahieren wollen.
Deswegen war ich eben so verwirrt, weil wir das noch nicht gemacht hatten.
Ja, wo ist denn auf meiner Tasse Tour
das Dollarzeichen, das wird ja nämlich nicht angezeigt.
So, ich würde mal vorschlagen,
dass wir das einmal ganz kurz debaken, um zu sehen,
ob da was Sinnvolles passiert.
Okay, ich tue das jetzt mal hier in den Streng
Und schreib das einfach mal auf die Konsole. Das ist so Debugging für Arme quasi.
So, also nochmal kurz meine Hoffnung, was passieren sollte.
Das sollte man sich immer als Programmierer klar machen,
bevor man irgendwas ausprobiert, bei dem man nicht ganz sicher ist.
Was erwarten wir, was rauskommt? Ich würde jetzt erwarten,
dass er diesen regulären Ausdruck nimmt,
über meinen gesamten Text rübergeht, irgendwann feststellt, oh ja,
ich habe jetzt eine Stelle im Text gefunden,
wo genau das steht,
nämlich Pipe Name gleich und dann irgendwie so eine Folge von Zeichen.
Und dann ersetze ich das, aber dann kriegen wir ja
Nee, das wird nicht funktionieren. Ihr seht,
es macht Sinn, dass ich da einmal vorher klarzumachen.
Was wird er nämlich dann machen? Er wird dann Folgendes machen.
Er wird diese Zeile, wird er ersetzen durch Domestic Dog.
Dann wird also hier drin stehen Domestic Dog. Das ist ja
Unsinn. Ich will mir die Informationen ja raus extrahieren.
Ich will sie nicht in Plays ersetzen. Also das war
genau das Falsche. Group One muss ich mir ausholen.
Ihr seht, ich bin manchmal auch noch für Word von regulären Ausdrücken.
So, das sieht schon besser aus. Ich sage also,
gib mir das, was hier in den runden Klammern drin stellt.
Ich will gar nicht, dass du irgendwas in dem Originaltext
ersetzt.
Dann machen wir uns vielleicht für welches Tier hatte das funktioniert?
Für Dog wird es noch nicht funktionieren wegen dieser Leertaste,
aber er wird es ja wahrscheinlich trotzdem bis hier machen.
Wir probieren es einfach mal aus. Nur wenn wir es
lange genug programmiert, wir müssen jetzt langsam mal ausprobieren,
sonst wissen wir nachher nicht mehr, wo oben und unten ist.
Also Dog, wir erwarten jetzt,
dass dieses Domestik auf die Konsole geschrieben wird. Ja,
reguläre Ausdruck über die Buggen macht dann wahrscheinlich auch Spaß.
Okay, no matchfound, okay. Okay,
er ist mir also an dieser Stelle gesagt, ah,
ich habe ihm glaube ich gar nicht gesagt,
dass er
das suchen soll
Das ist auch so ein kleiner Stolperstein.
Ihr müsst ihm einmal sagen, finde das mal bitte.
Und das Verwirrende ist, diese Methode liefert ein Bulien zurück
und den muss man dann einfach ignorieren.
Schauen wir mal, ob es jetzt funktioniert.
Na, okay. Wieso kommt da jetzt ein Nal zurück?
Haben wir diese ganzen Leertasten doch tatsächlich? Also hier steht ja
immer noch, dass wir diese Leertassen auf jeden Fall brauchen.
Gehen wir noch mal ganz kurz in den Text rein.
Ja, hier sind tatsächlich Leertasten.
Also daran kann es eigentlich nicht liegen
Hm, okay. Dann machen wir mal weiter. Debuggern.
Ich kann ja mal fragen, wo er das gefunden hat.
Also, Start. Das ist schon in meiner Variable.
Und das geben wir auch mal auf die Konsole aus
Klar. So, dass es nicht zu verwöhnt ist.
Dann sehen wir nämlich die Position im Text, hoher das
gefunden hat. Er scheint es tatsächlich nicht zu finden.
Das ist dann jetzt wahrscheinlich irgendein ganz blöder Fehler.
Wir können den regulären Ausdruck einmal vereinfachen. Ah, ah.
Nein. Dieses Zeichen hat eine besondere Bedeutung in regulären Ausdrücken.
Das muss ich
auch escapen
Aha, seht ihr? Schon besser. Also,
er hat an den Stellen von 199 bis 225,
hat er diesen Match gefunden und in der Gruppe 1 steht dieses Domestik.
Das ist nicht der WC-Reiniger, sondern das ist von dem Hund.
Okay. Wenn ihr irgendwann mal real Software entwickelt und reguläre Ausdrücke benutzt,
ihr braucht immer einen Experten in eurem Team für reguläre Ausdrucke,
sonst werdet ihr wahnsinnig.
Diese Fehler sieht man sonst einfach nicht. Okay,
wollen wir das jetzt mal so machen, dass man auch Leertasten akzeptiert?
Das ist ja spannend. Das ist, oder ich glaube,
ich schiebe es doch mal mit Blick auf die Uhr nach hinten,
denn die Frage ist,
was ist,
wenn hier
weitere Leertasten kommen
Ich schiebe es erst mal nach hinten. Wo war das einfach?
Das war ja bei dem Shark, glaube ich, einfach.
Ach du Scheiße, was hat er denn jetzt?
Okay. Schauen wir uns den Shark noch mal an,
ob der irgendwie anders aufgebaut ist oder ob uns da wieder irgendwelche Leertasten reinreiten.
Shark. Ich glaube, da fehlten irgendwo Leertasten, oder?
Haben wir nicht gesagt, dass wir hier Leertasten brauchen?
Ja. Ja. Der meint den Fehler
Genau. Wir sind also bis jetzt immer davon ausgegangen,
naja, in den Beispielen, die wir uns angeguckt haben,
war ja aber mindestens ein Leerzeichen.
Und dieses Plus Plus heißt eben mindestens eins.
Und wenn ich sage, ich erlaube auch null,
dann schreibe ich hier ein Sternchen statt im ersten Fluss.
So, das mache ich jetzt hier mal auch.
Hier mache ich das aber nicht. Denn ich erwarte ja
tatsächlich, dass Hinternahme mindestens ein Zeichen steht. Ja,
also bei den Leertasten kann es auch mal sein, dass sie gar nicht dastehen.
Aber bei den Namen muss ja wohl mindestens ein Buchstabe da stehen.
Mal sehen, ob Shark jetzt funktioniert. Ja, schon
besser. Okay. Lass uns mal von den regulären Ausdrücken,
die ja unheimlich lustig sind, langsam wieder zurückkommen zu unserem Material Animal,
um das wir uns eigentlich kümmern wollten.
Also, man muss immer sehen,
dass man sich nicht zu sehr in technischen Details verliert.
Ich mache das total gerne, aber man muss sich
dann immer selber so ein bisschen bremsen.
Also, das ist also der Name, den wir da finden werden.
Und eigentlich gefällt mir das gar nicht so gut,
dass ich hier beides in der Methode mache,
aber das können wir gleich beeffekten.
Ich muss jetzt im Prinzip dasselbe nochmal machen für einen anderen
regulären Ausdruck. Den nennen wir dann mal Klassisch.
Den müssen wir dann so nennen vielleicht. Oder nee,
hier musste der Pyraschie, was ist der Plural von Klasse
Klassisches Sess, ich weiß es nicht.
Also wenn jemand Lateinhalle wird, aber jetzt wahrscheinlich köpfen wollen.
So. Und diesen regulären Ausdruck müssen wir uns natürlich noch überlegen,
der sieht aber fast genauso aus. Der sieht ja genauso aus,
nur dass wir hier nicht Name reinschreiben, sondern klassisch.
Ja, das ist der einzige Unterschied.
Ansonsten sieht das ja genauso aus. Pipe, Klassisch,
gleich und dann was auch immer die Klasse ist.
Okay, auch dann könnte man jetzt eigentlich hier mal
das Animal erzeugen und zurückgeben,
Ah, ne, können wir noch nicht.
Können wir noch nicht. Ich schreibe das hier mal rein.
Wir sammeln die Informationen so nach und nach zusammen und erst,
wenn wir sie alle haben, können wir sie erzeugen.
Also mache ich mal eine Exemplarvariable für den Name.
Dann mache ich eine Exemplarvariable für die Klasse.
Dann brauche ich natürlich nicht mehr die eigenen Variablen hier.
So, wird es da schön reingeschrieben. Okay,
dann gehen wir wieder zurück, wo wir das benutzen.
Das machen wir ja hier. Und dieses Retain first sentence
sorgt dann ja dafür, dass diese Beschreibung ausgefüllt wird.
Okay, ich glaube also jetzt, an dieser Stelle sind
wir so weit, dass wir dieses Animal erzeugen können.
Wollen wir
das mal machen
New Animal. Okay. Der Name des Tiers,
ja, der war ja so, ne?
Das hatten wir uns ja gerade rausgeholt mit diesem regulären Ausdruck.
Dann kam als nächstes diese Klasses, das heißt,
die haben wir ja hier reingespeichert.
Dann kam als nächstes die Description, die hieß ja Zor.
So. Und dann tun wir das doch mal in eine eigene,
ne? Das will ich haben. Ich weiß nicht,
ob wir das Wort Animal schon vergeben haben,
ich nenne es jetzt erstmal nur
Okay. Das ist jetzt also dieses Animal-Objekt,
was ich jetzt erzeugt habe und die Anfangsmotivation war ja zu sagen,
ich will keine Map haben,
die einfach nur von Strings of Strings abbildet und dann habe ich nur die Beschreibung in der Map,
sondern ich will auf Animals abbilden.
Ja, ich sage jetzt also nicht mehr einen String,
sondern auf Animals soll er abgebildet werden und dann kann ich das da unten wunderbar in diese,
ja jetzt müssen wir uns gleich mal hier durchwühlen,
aber ich will erstmal, dass wir es richtig reintun.
Okay. Das heißt,
jetzt will ich nicht mehr nur die Beschreibung reintun,
vorher hatten wir nur die Beschreibung angetan,
jetzt will ich dieses komplette Tier reintun.
Okay, jetzt muss er da nicht
zufrieden sein und hier machen wir das genauso
Okay. Gut, jetzt ist das ganze Tier da drin.
Jetzt natürlich hier oben die Logik, das Animal rauszuholen.
Die habe ich mir vorher nur die Beschreibung rausgeholt.
Das muss ich jetzt natürlich genauso machen,
dass ich das jetzt in ein Tier rein tue.
Jetzt muss ich mal Gedanken machen, tue ich das in
eine lokale Variable? Ist wahrscheinlich sinnvoll, oder? So,
da kann ich ja unten, glaube ich,
auch einfach sagen, dann verwende ich die Variable unten auch,
dann brauche ich nicht zwei verschiedene, das verwirrt ja nur.
So, und dann muss ich das ja unten natürlich
auch zurückgeben
Oh, der Rückabitur stimmt natürlich noch nicht, ihr seht,
alles mögliche ändert sich jetzt. Okay. Nochmal kurz,
weil ich jetzt so schnell getwittert habe, was habe ich jetzt geändert?
Also vorher hatte ich ein Stringen reingetan und es kam
ein String zurück, jetzt soll ein Animal zurückkommen.
So ein schönes Animal Material. Dann habe ich unten in
die Map nicht mehr Strings reingesteckt, sondern das Animal,
was ich mir jetzt hier erzeugt hatte mit den ganzen Informationen,
die ich mir extrahiert hatte, mit Hilfe der regulären Ausdrücke.
Blau und hier unten passiert es genauso. Und dann liefere ich auch
ein Animal zurück und nicht einfach nur die Beschreibung des Animals.
So, ich habe jetzt etwas an der Schnittstelle geändert von dem Animal Service.
Da müssen jetzt eigentlich immer gleich die Alarmglocken angehen.
Naja, das wird ja wahrscheinlich jetzt Auswirkungen auf den Klienten
Es muss jetzt eigentlich irgendwo einen Übersetzungsfehler geben. Schauen wir mal,
wo er ist. Hier ist er. Jetzt frage ich
mal euch, dass ihr hier vielleicht mir nicht wegschlaft.
Warum gibt es jetzt hier ein Problem? Genau, und
das ist einfach ein Typfehler. Also holen wir uns hier
mal ein Animal raus. So, ne? So,
das habe ich jetzt noch hier umbenannt. Okay. So,
das ist jetzt übersetzbar, aber das heißt ja nicht,
dass es auch 100 Prozent das tut,
was wir wollen.
Schauen wir,
was jetzt passiert
Hat ja mal eine Idee, was jetzt passiert? Fünf Sekunden drüber nachdenken.
Achtung. Hm. Was heißt das denn? Ja,
also irgendwie sagt sie mir, dieses Objekt liegt irgendwo an dieser Adresse im Speicher.
Das ist ja so toll. Das interessiert mich aber eigentlich gar nicht. Was macht man denn,
wenn man, ich meine,
normalerweise würde ich jetzt irgendwelche Methoden reinschreiben, Geld,
Discryption und was weiß ich, gibt es irgendwie so eine schöne,
einfache Möglichkeit zu sagen, immer dann,
wenn ich ein Animal auf die Konsole schreiben will,
soll Folgendes auf die Konsole geschrieben werden.
Also irgendwie, das ist so eine sinnvolle String-Darstellung gibt von
diesem Animal.
Kann man
sowas im Java machen
To string. Toll. Also sozusagen wird im Hintergrund immer dann,
wenn sowas passiert, ihr übergebt ein Objekt an System-Out-Printline,
wird die To-Scring-Methode darauf aufgerufen.
Und wenn wir die sinnvoll überschreiben für unser Animal,
dann sieht man doch hoffentlich, was sind Followers.
Okay, also machen wir mal hier so ein Override.
Ich will das jetzt also hier ersetzen aus der Object-Klasse.
So. Okay, ein bisschen größer, dass ihr mehr seht.
Okay, was wollen wir denn da mal zurückgeben?
Sagen wir doch einfach mal was ganz Einfaches. Also erst soll da
der Name stehen. So, dann vielleicht ein Zeilenumbruch,
Backstage N kennt ihr jetzt ja auch schon,
dann soll der vielleicht als nächstes die Klasses stehen,
dann wieder Backstage
Und dann soll da vielleicht die Disc Rep,
die Disc Reption stehen und vielleicht nochmal ein Wechsel stehen.
Also einfach in einzelne Zeilen untereinander diese drei Informationen.
Mal gucken, ob jetzt was sinnvolleres passiert.
Okay. Wieso steht da jetzt zweimal Domastic? Ist das
ein Fehler? Ist das einfach nur ein Denkfehler?
Zwei Mentor, der eigene Ude, das ist frei.
Ah, ja. Das ist natürlich furchtbar. Das liegt daran,
dass ich zu viel in dieser einen Methode mache.
Ich splitter das einmal auf. Dann werdet ihr sehen,
dass der Compiler diesen Fehler für mich erkennt.
Also, ich mache einmal eine Methode, Detect Name.
Ihr dürft nie zu viel in einer Methode machen und Variablen wiederverwenden.
Das gibt ganz oft Probleme. Also,
das tue ich mir jetzt mal hier rein.
So. Und dann mache ich mir eine für die Klasse.
Da kommt dann dieser Quelltext rein. Das ist ja toll,
dass du den Fehler gesehen hast,
ohne dass der Quelltext sichtbar war auf dem Bildschirm.
Das hast du
dir hoffentlich gemerkt von vorher
Sonst attestiere ich dir magische Fähigkeiten. So, ne?
Und jetzt seht ihr, jetzt gibt es einen Übersetzungsfehler,
der Compiler sagt mir jetzt von dieser Variable,
habe ich noch nie was gehört.
Vorher hat er einfach die hier wiederverwendet,
weil sie ja im selben Scope sozusagen war.
Jetzt brauche ich auch diese zwei nicht mehr.
Das sieht doch alles viel sauberer aus, oder?
Okay, starten wir es nochmal. Hm? Warum ist
die Konsole jetzt so komisch? Gut, Computer halt,
ne? Okay, das ist doch nicht schlecht.
Wie gesagt, das mit der Lehrtaste, darum kümmern,
kümmern wir uns am Ende der Vorlesung.
Wir haben nur noch 20 Minuten. Jetzt wollte ich ja
ganz gerne mal mit euch diese Filter Funktion bauen.
Was ist denn jetzt los? Moment. Warum funktioniert das
jetzt für den Hund nicht mehr, Main?
Nochmal, was ist denn hier das Problem?
Okay, das hier geht's. Also es scheint nur mit
dem ersten Tier zu gehen und danach geht's nicht mehr.
Das ist ja irgendwie sehr merkwürdig. Was ist,
wenn ich nochmal den Dog eingebe? Okay, und Caro
? Hm, starts nochmal neu
Das ist ja merkwürdig. Also es funktioniert nur für das
erste Tier und danach funktioniert es nicht mehr.
Ja. Da, wir sind jetzt 100 Debugger,
die Gleitzeitig auf denselben Quertext draufgucken. Woran könnt ihr das
denn liegen? Wir könnten ja vielleicht mal einen Breakpoint setzen,
sonst haben wir, glaube ich, keine Chance zu verstehen,
woran das liegen könnte, oder?
Was machen wir denn nicht hier? Oh, ha,
sieht jemand das Problem
Ja. Ja. Was wollten wir deinen Eitel an dieser
Stelle prüfen? Es gibt ja immer dieses klassische Muster,
ich hole mir was aus einer Mappe raus und gucke,
ob es nahe ist.
Das hatten wir ja vorher gemacht. Wir haben uns die
Description rausgeholt und haben geguckt, ob die Description null ist.
Jetzt holen wir uns das Tier raus und prüfen,
ob die Description null ist.
Ja, was muss ich stattdessen machen?
Sieht das jemand?
Also nochmal, diese Gerd-Methode liefert euch nall zurück,
wenn es keinen Eintrag in der App gab zu dem gewünschten String.
Okay. Ich bin froh, dass ich das so schnell gefunden habe.
Normalerweise kann man nicht absehen, wie lange das dauert und
man hat ja nur eine begrenzte Zeit an so einer Vorlesung.
Okay. Okay. Gut. Und wenn ich grau eingebe,
kommt da auch was anderes aus als Domestik.
Das ist doch gut. Sehr schön. Jetzt war ja das,
was ich als nächstes mit euch machen wollte,
zu sagen, ich will filtern nach Säugetieren.
Wie soll das überhaupt funktionieren? Ihr startet das Problem auch
nochmal ganz kurz. Wie kann ich jetzt dem Programm klar
machen, dass ich nach Säugetieren suche?
Wir müssen uns jetzt da irgendwas Spezielles ausdenken und das entsprechend unterstützen.
Also vielleicht sage ich einfach, Ich kann mir jetzt
irgendwas ausdenken und danach implementieren wir das Surfen.
Vielleicht sage ich irgendwie, add. Mama,
wie Mamalia hieß es, glaube ich, so, ja.
Also dieser Syntax soll bedeuten in unserem eigenen Selbstgeschehen-Programm.
Du sollst nur Tiere auflisten, die Säugetiere sind.
Ja, das kriegen wir, glaube ich, hin.
Also gehen wir mal kurz in unseren Rappel
Hier. Also bis jetzt haben wir mal Folgendes gemacht.
Wir haben gesagt, es wurde eine Laien vom Benutzer eingegeben
und ich gehe davon aus, dass es ein Tier ist,
weil was anderes konnte man bis jetzt nicht machen.
Der Benutzer gibt ein Tier ein und ich verarbeite dieses Tier.
Wir müssen jetzt einfach nur eine ganz kleine Abfrage noch machen,
ob da dieses Ad am Anfang steht.
Und ich mache es sogar jetzt noch viel einfacher,
dass es nur für unseren Spezialfall funktioniert.
Ich frage also einfach, wenn Laien, dann mach irgendwas Besonderes.
Ansonsten mach das, was du vorher gemacht hast.
Sieht jemand jetzt schon
ein Problem
Niemand? Was mache ich denn in Zeile 45?
Wir müssen Equals nehmen, das wird sonst nie funktionieren,
weil hier Referenzen vergleicht von einem String,
den er zur Übersetzungszeit kennt und einen,
der erst zur Laufzeit feststeht,
das wird niemals dieselbe Referenz sein.
Java, Java,
Java.
So, und jetzt ist es so,
ich bin jetzt hier in meinem Klienten irgendwie,
ich will natürlich diese Filterung nicht selber machen.
Ich habe jetzt ja über diesen tollen Animal Service,
ich will diesem Animal Service sagen, gib mir alle Säugetiere.
Das wünsche ich mir einfach. Ich wünsche mir einfach,
dass es irgendwie sowas gibt wie Collection von Animal Memmels,
gleich, wie heißt mein Service,
Animal Service, Punkt, Get Memmels.
Ja, das soll einfach gehen. Okay,
jetzt kennt ihr natürlich Collection nicht, das muss ich
einmal importieren
Ja, okay, also schade, dass das nicht in
der Reihenfolge macht, wie ich es hinschreibe.
Also er beschwert sich natürlich erstmal,
das ist dieses Get Members nicht gibt und stelle mir vor,
schreibe doch dieses Get Members in Android Service.
Ja, das will ich machen. Und dann haben wir
unten die Methode, hat er alles für mich hingeschrieben, toll.
Jetzt will ich aber wieder zurückgehen. Und noch weiter zurückgehen,
hier. Und hier muss ich jetzt das Collection noch importieren,
sonst würde er das nicht kennen.
Ja, genau. Muss ich also auch nicht selber hinschreiben.
Gut. Warum beschwert er sich jetzt noch?
Das habe ich doch gerade korrigiert, das Problem.
Vielleicht, ich habe es noch ein bisschen verwirrt gerade.
So, Collection kennt ihr jetzt hier auch nicht, ne?
Das war, glaube ich, das Problem. Bitte importieren.
Gut. Wie machen wir das denn jetzt? Also,
wir haben ja hier oben, was für Daten haben wir zur Verfügung?
Wir haben diese Map. Diese Variablen hier sind ja eigentlich immer
nur dann wichtig, wenn gerade nach dem Tier gesucht wird.
Eigentlich ist es ein bisschen komisch, dass wir die überhaupt haben.
Aber gut. Wir haben also diese Map,
das ist jetzt wieder Kao und Cap und Fisch und was weiß ich was drin.
Und ich will jetzt eine Sammlung erstellen,
wo alle die Animals drin sind, die Memmels sind.
Irgendwelche Vorschläge von euch
Ich muss mich ja hier gar nicht hetzen.
Ich habe ja Zeit, ihr habt auch Zeit.
Wie würdet ihr das machen? Überlegt doch mal so ein bisschen,
lasst doch mal die Zahnräder rattern. Ja. Zwei Leute
melden sich schon, die schon was gesagt haben heute.
Du hast, glaube ich, am längsten nichts gesagt.
Ja. Hast du ja mal gelogen. Genau,
wir durchlaufen auf diese Map und prüfen, ob es ein Memmel ist.
Bevor wir das machen, ich muss das Programm noch einmal
ganz kurz starten. Ich bin mir jetzt schon gar nicht mehr
so hundertprozentig sicher, wie das eigentlich wirklich genau heißt.
Also wenn ich jetzt hier Kate eingebe, ah hier,
Mammalia, das muss ich mir einmal in die Zwischenablage tun,
weil das vergesse ich gleich sonst wieder.
Also wir wollen durch diese Map durchschleifen. Und jetzt ist
die Eclipse ja wahnsinnig schlau. Ich mache jetzt mal folgendes.
For each. Das hatten wir, glaube ich, schon mal,
oder? Diese magische For each in diesem Semester hineinsteuern,
Leertaste und Enter, mal gucken, was jetzt passiert.
Ah, nee, schade. Ich hatte gehofft,
dass er versteht, dass er über diese Map da oben iterieren soll.
Na gut. Animals heißt sie, ne? Also Animals
. Ja, und jetzt ist natürlich die Frage,
was ist denn jetzt der Elementtyp?
Das ist ein bisschen schwieriger
Also, wenn es eine List wäre,
eine List von Animal, dann wäre der Elementtyp Animal,
wenn es ein Set von Animal wäre, wäre der Elementtyp Animal.
Jetzt habe ich aber eine Map von String und Animal.
Was ist denn jetzt der Elementtyp von dieser Sammlung?
Wenn ihr noch nie über eine Map rüber irre habt,
könnt ihr das nicht wissen.
Nee, es ist nicht Animal. Es ist etwas anderes
. Ich glaube, das heißt so, oder?
Ein Entry von String und Animal und ich nenne den mal Entry.
Ich glaube, so ist die Sonntags. Das muss ich
wahrscheinlich noch importieren, sonst kennt ihr das nicht.
Oh Gott, dieses Entry will ich haben. Ja,
ja, er ist nicht zufrieden. Warum ist er nicht
zufrieden? Hä? Hä? Was? Wow,
with Map String Animals habe ich mich da irgendwie...
Hm. Habe ich nicht in einem Programmieriktat über eine Map
eteriert? Hm. Okay. Machen wir es anders.
Toll, dass du das Wort Z gesagt hast.
Man kann so einer Map sagen, gib mir mal eine
Menge mit deinen ganzen
Ah, das habe ich vergessen. Sorry, so,
ne? Genau, so kann man es machen.
Sorry. Also ich muss dieser Map sagen, gib mir mal
eine Menge deiner Einträge. Aber es gibt nur noch andere Methoden,
die machen es, glaube ich, noch ein bisschen einfacher.
Ich kann nämlich sagen, das war doch gerade hier, oder nicht?
Values. Ja, da kann ich also sagen,
ich interessiere mich gar nicht für den String unters Animal,
sondern nur für die Animals.
Gib mir mal eine Collection, wo jetzt nur die Animals drin sind.
Dann kann ich das hier vereinfachen auf Animal Animal.
Dann ist es, glaube ich, nicht so verwirrend für euch,
oder? Jetzt sieht es, glaube ich,
ein bisschen einfacher aus oder ein bisschen so,
wie man es schon kennt.
Das ist der Elementtyp
So nenne ich das Element. Und jetzt steht sie nicht nur eine Variable,
sondern ich sage dieser Map, gib mir mal eine Collection,
wo jetzt nur die abgebildeten Animals drinstehen.
Okay, das kann man, glaube ich, gerade noch verstehen.
Okay, jetzt haben wir ein Problem. Denn was,
mit so einem Animal kann ich jetzt ja nichts Tolles machen,
was kann ich machen?
Ich kann fragen, ob es gleich mit einem anderen ist.
Ich kann mir einen Hashcode geben lassen, einen Tustring, das haben wir implementiert.
Ich komme jetzt ja überhaupt nicht ran, an diese,
an diese Information, was ist jetzt für eine Klasse ist,
was machen wir denn jetzt?
Gehe ich mal in das Animal rein?
Habt ihr da irgendeinen Vorschlag, wie ich jetzt an
diese Informationen rankomme
Mhm. Genau, und man will irgendwie an diese Variablen
rankommen und dann schreibt man halt diese Gat-Methoden, ne?
Also Public, String, Get, Classes.
Return. Classes. So, das kann man machen.
Und dann würde das folgendermaßen aussehen. Dann würde ich hier schreiben,
wenn animal.get, nein, und jetzt muss ich wieder daran denken,
dass es Equals ist.
Und habe ich das noch in der Zwischenablage?
Ja. Dann mache ich irgendwas. Ja, Punkt,
Punkt, Punkt. Überlegen wir uns gleich, was wir
dann machen müssen. Das Problem an dieser Zeile ist,
Ah, ich finde die irgendwie nicht so lesbar.
Ich finde, sie liest sich nicht so flüssig.
Also irgendwie ist das so ein bisschen nur ein Java-Programmierer,
der wird das hier vielleicht irgendwie falsch lesen oder Get Class
stattdessen lesen oder vielleicht auch manchmal schreiben aus Versehen.
Wäre es nicht viel schöner, wenn ich schreiben könnte,
he's memo. Die Welt wäre doch so viel schöner,
wenn ich das einfach so direkt fragen könnte.
Bist du ein Säugetiere? Beantworte mir doch mal die Frage,
ob du ein Säugetier bist. Die Methode gibt es
nicht, die müssen wir schreiben. Das heißt,
ich kann jetzt diese hässliche Logik, die ich im Prinzip gerade implementiert hatte,
kann ich jetzt verstecken in dem Säugetier,
sage ich also einfach klassisch, Equiels, das.
Es macht natürlich, letzten Endes passiert jetzt dasselbe,
dieser String-Vergleich passiert jetzt einfach nur in einer anderen Klasse.
Aber ich finde es einfach schön, dass man jetzt
im Klienten nicht mehr so viel Hirnschmalz darauf verwenden kann,
ja, was will denn eigentlich der Programmierer hier erreichen?
Wir werden hier, jeder, der halbwegs Englisch kann und liest,
Animal is Memmel, kann man eigentlich, bin ich der Meinung,
nicht mehr falsch verstehen.
Gut, wir sind jetzt also in unserer Schleife.
Wir haben uns jetzt vielleicht ein paar Tiere angeguckt, die
keine Memmels waren. Jetzt haben wir das erste Memmel gefunden.
Was wollen wir jetzt damit tun? Unser Ziel ist es
ja, eine Collection zurückzugeben von den Memmels.
Das muss man jetzt machen. Einfach return,
dann wären wir schon fertig,
Darum würde er es nicht mehr sagen. Du willst
ein Set als Puffer machen? So. Elmel, ne?
So. Ja, toll. Ach, das sieht doch
nicht schlecht aus.
Okay,
das gefällt mir
Dann gehe ich mal wieder in meinen Rappel zurück.
Und ich glaube, diese Syntax,
ich mache es nicht vielleicht doch mal ein bisschen englischfreundlicher.
Wollen wir sie vielleicht mal so nennen? Ich glaube,
das kann man sich besser merken, oder?
Marmalia klingt so wie ein Pizza-Restaurant oder so.
Okay. Ja, also da kriege ich es jetzt zurück.
Und was machen wir jetzt? Kann man eigentlich Sets auf
die Konsole schreiben? Ich weiß es ehrlich gesagt gar nicht.
Kann man, ja. Ich glaube, bei Erichs geht
es nicht. Wir gucken einfach mal, was passiert.
Ich schreibe jetzt einfach mal alle Memmels,
die da zurückkommen, schreibe ich mal auf die Konsole.
Wieso ist das hier schon wieder so komisch?
Also mache ich mal Cat. Und was war jetzt kein
Memmel? Shark war kein Memmel, ne? Genau,
das ist hier offensichtlich kein Memmel. Ich kann das
nicht mal aussprechen. Und dann machen wir noch Dog.
Und irgendeins hatte ich doch noch. Scorpion. Genau. Und
wenn ich jetzt also dieses Ed Memmel sage, diesen Sonderbefehl,
oder habe ich es mit S oder ohne es,
ich habe es schon wieder vergessen, dann erwarten wir jetzt,
dass er mir Cat und Dog rausspuckt.
Mal sehen, was jetzt passiert.
Okay, das sind die richtigen Informationen.
Es ist irgendwie noch nicht so richtig wahnsinnig hübsch, oder?
Also offenbar ist es in Java so, wenn Sets auf
die Konsole geschrieben werden, werden die in eckige Klammern getan.
Ihr seht, die Ecke in Klammern haben schon wieder eine neue Bedeutung.
Also in dem Kontext Sammlung auf eine Konsole zu schreiben,
stehen eckige Klammern offenbar für Sets.
Ich weiß nicht, ob das bei Listen andere Klammern sind.
Vielleicht werden alle Collections so geschrieben. Das Format finde ich jetzt
ehrlich gesagt nicht so dolle. Wie kann ich das denn
mal so hinkriegen, dass es irgendwie ein bisschen schöner ist?
Also ich will nicht einfach nur diese Collection auf die Konsole schreiben,
als ein Objekt,
sondern irgendwie schön untereinander vielleicht mit Strichen getrennt oder irgendwas die
einzelne Tiere
Jemanden Vorschlag. Hat es schon Sophie, sonst keiner.
Es ist einfach. Genau. Und ich gucke um jetzt,
ihr küsst ihn als Schlauer noch aus mit der VE-Schleife.
Ah. Seht ihr es? Jetzt hat er es verstanden,
was ich will. Ha. Toll. Ja. Und dann?
Das ist jetzt die Frage, was wollen wir haben?
Also wenn man jetzt eine Filterfunktion hat,
würde man ja davon ausgehen, okay, ich habe eine riesige Datenbank,
da sind vielleicht tausend Tiere drin und vielleicht sind 500 irgendwelche Memmels.
Ich will jetzt nicht alle Informationen haben.
Vielleicht reicht mir der Name, oder
Der Name reicht. Okay, jetzt habe ich schon wieder ein Problem,
an den Namen komme ich ja gar nicht an.
Aber ich wünsche mir einfach, ich würde daran rankommen,
ich sage einfach animal.getname, gibt es natürlich nicht.
Dann sage ich, Eclipse, ich brauche diese Methode.
Ich komme da darauf, dass es ein Charles Array sein soll.
Nein, ein String. Ein String ist doch viel natürlich,
ein Charles. Und dann geben wir den Namen zurück.
So, okay. Mal sehen, ob das jetzt besser
ist. Also mache ich wieder Cat und Dog und Shark
und Scorpion
So, und dann mache ich mal Mevels.
Äh. Ah, ja. Ciao, jetzt haben wir
das Problem von eben, ne? Das wollten wir noch
beheben. Toll, dass wir daran erinnert werden.
Warum steht da jetzt zweimal Domestic? Naja, es ist
eben einmal der Domestic Dog und einmal die Domestic Cat.
Ah, okay. Ja. Wir kommen also wieder zu
unserem Lieblingsthema. Ups. Nämlich reguläre Ausdrücke. Soll ich
das mal so nach oben? Hat hier mal eine Idee
, wie wir das hinbekommen
Dass da eben auch Leertasten zugelassen werden.
Einmal größer machen. Hier, ne? Nee,
ist genau. Ich schiebe das nochmal ein bisschen hoch,
dass klar ist, es gehört logisch hierzu. Ja,
also momentan sagen wir ja an dieser Stelle,
ein Name besteht aus mindestens einem Buchstaben, können aber beliebig viele Buchstaben sein,
aber sobald der erste Nicht-Buchstabe kommt, ist dann Finito.
Ich weiß gar nicht, ob es da so eine gute
Möglichkeit gibt, das jetzt zu kombinieren mit was anderem,
hat jemand einen Vorschlag?
Reck-Ex-Könige an die Front. Du ganz hinten hattest
lange nichts gesagt. Ja, du, ja
Wir können uns einfach da Glauben machen und das erlauben fürs Zeugnis.
Das Wort aus der Zeitung. Wo genau muss ich jetzt
Klammern schreiben und welche Klammern? So? Nee. So. Und
dann so? Und dann so? Das weiß ich bei
dem Wert. Okay, falls da Tabs oder irgendwas sind.
Ich glaube, Leerzeichen reicht, oder? Ja,
also ich glaube nicht, dass da irgendwann mal Domestic,
Tape, Dog oder die Domestic Enterdog oder so steht.
Das muss ja, wenn überhaupt, muss das ein Wehrzeichen sein.
Also was anderes macht an der Stelle keinen Sinn.
Ist es das tatsächlich
Probieren wir mal aus. Also, okay, Tamarok und Shark.
Ah, toll. Ah, ist doch nicht schlecht.
Okay. Kann ich das eigentlich auch wieder eingeben? Also,
ich meine, die Tiere, die ich bis jetzt angegeben habe,
waren ja so Abkürzungen, versteht Wikipedia.
Das kann ich sagen, Domestic Cat. Oh ja,
das geht tatsächlich. Also, Cat schien nur,
schien nur eine Abkürzung davon zu sein.
Das wäre irgendwie blöd, wenn ihr mir sagt,
ich kenne diese Begriffe und dann geht das gar nicht.
Das wäre ein bisschen sehr merkwürdig.
So, dann muss ich euch noch einmal kurz eine Seite zeigen.
Die müsst ihr als Bookmark auf allen euren Rechnern drauf haben,
habe ich den eigentlich als Bookmark? Nee, das ist halt
peinlich. Ja. Auf dieser Seite ist alles beschrieben,
was ich euch jetzt vorhin versucht habe nahe zu bringen. Ja,
also wenn ihr irgendein halbwegs normales Zeichen X haben wollt,
dann schreibt ihr das einfach direkt hin,
also irgendwelche Buchstaben oder was hat denn noch keine Sonne,
aber doch nur die Raute hat zum Beispiel keine Sonnebedeutung.
Während wenn ihr zum Beispiel einen Backstage haben wollt,
dann braucht ihr zwei Backslasher, Gibt es hier sonst noch was?
Ja, das ist spannend, ja. Also wenn ich sage,
einer der folgenden Zeichen, dann tut man das in solche eckigen Klammern,
dieses Zielkomflex, hatte ich euch auch erzählt, das negiert quasi das,
also alles außer A, B und C soll zugelassen werden.
Was ich euch nicht gezeigt habe, man kann auch solche Ranges angeben,
also alles von A bis Z, klein und A bis Z groß, wunderbar. Dann dieser Character-Classes,
die wir benutzt haben, werden hier auch erklärt,
das steht also für White Spaces, das steht für,
guck mal, das können wir sogar sehen,
was es genau ist, so genau hätte ich es jetzt gar nicht gewusst,
also Kleinwuchstaben, Großbuchstaben, Unterstrich und Ziffern,
ist ja zum Beispiel erlaubter
Okay, das könnt ihr ja alles nachgucken. Und das werdet
ihr immer brauchen, wenn ihr mit regulären Ausdrücken umgeht.
Das meiste davon hat man dann irgendwann im Gedächtnis,
aber so ein paar Dinge vergisst man dann doch wieder.
Okay, und hier wird auch der Unterschied erklärt zwischen,
was bedeutet das, wenn ich schreibe,
plus oder plus Fragezeichen oder plus plus.
Dafür reicht die Zeit jetzt nicht mehr. Dafür gibt es
auch tolle Fragen auf Stackoverflow. Okay, jetzt gucken wir
uns nochmal ganz kurz an, was wir gemacht haben.
Eine kleine Zusammenfassung, dass sie sich einfach so plötzlich zu Ende ist.
Also was haben wir gemacht? Wir haben auf der obersten Ebene,
haben wir gesagt, wir wollen nicht einfach nur eine dumme Map haben,
die mir zu einem String ein String gibt.
Mit dem String kann ich irgendwie keine tollen,
sinnvollen Sachen machen.
Ich will
ein eigenes Material haben
Dieses Material haben wir Animal genannt. Und wir haben in
dieses Animal D-Information reingetan, die für unseren Anwendungskontext relevant war.
Ihr hättet mich jetzt sagen können, hey Fred,
in Wikipedia sind doch noch 20 andere Dinge drin.
Warum hast du die denn nicht reingetan?
Ich habe sie deswegen nicht reingetan, weil der Anwender,
der Kunde, also in diesem bei ich oder ihr,
normalerweise sind es natürlich andere Leute, die sagen euch,
was sie brauchen.
Das ist unheimlich wichtig, dass ihr immer das macht,
was der Kunde will und nicht irgendwas anderes,
nur weil es geht.
Okay. Also diese drei Strings machen sozusagen
dieses Animal aus.
Versucht immer, dass eure Materialien nicht einfach nur aus diesem Ghettern bestehen.
Also ich mache mir ein Materialsteck in den Konstruktor,
die Daten rein und dann kann ich die mit Ghettern wieder rausholen.
Versucht irgendwie, dass es auch sinnvolle Operationen,
wie zum Beispiel sowas gibt, die dafür sorgen,
dass der Quelltext auf Seiten des Klienten lesbarer wird.
Ich finde es immer toll, wenn man irgendwie,
wenn da nicht irgendwas steht wie String-Vergleiche oder irgendwas,
sondern wenn da so was Schönes steht an der Methode,
die mit dem Prefix IS anfängt.
Dann ist irgendwie völlig klar, was der Sinn hinter dieser Abfrage ist.
Sonst ist das vielleicht nicht ganz so klar. Okay,
also wir haben uns dieses Material erzeugt und dann haben wir
das eben hier eingesetzt
Und dann haben wir gesagt, wir spare ich euch jetzt
keine Strings mehr in der Map, sondern Animals.
Dann haben wir uns eine ganze Zeit mit regulären Ausdrücken beschäftigt.
Das hat viel mehr Zeit gebaut, als ich dachte.
Und dann haben wir Folgendes gemacht. Wir haben diese Metadaten erst
ganz am Ende entfernt und bevor wir sie entfernt haben,
haben wir gesagt, ich will diesen Namen finden, anhand dieses regulären Ausdrucks.
Ich will diese Klasse finden, man hat dieses regulären Ausdrucks.
Und aus diesen Daten erzeuge ich mir dann dieses Material und
dann tue ich dieses Material in diese Map rein.
Sodass der Service jetzt diese Materialien verwaltet und nicht einfach nur
die Beschreibung als Strings. Okay. Und ich hoffe,
dass das nicht zu weit entfernt ist von dem,
was ihr letzte Woche in der Vorlesung gelernt habt. Und ich hoffe,
dass es nicht zu weit entfernt ist von dem ist,
was ihr in den Übungen macht, wo ihr ja auch euch überlegen musstt,
Wo man irgendwie mit solchen Karten, also vor mehr Karten,
Verleihkarten, in Maps umgeht, das ist,
glaube ich, schon relativ nah daran.
Okay, ich bedanke mich bei euch und bis nächste Woche