Verständnis für ein Code
Michilee
- java
Hi nochmals,
ich hatte auf meinem Rechner folgenden Code seit längerem gespeichert. Keine Ahnung woher und für was für einen Zweck ich das gespeichert hatte. Aber irgendwie checke ich nicht genau, was es vor hat oder wofür das gut sein soll.
Jemand vielleicht nen Tipp? (Versuche zurzeit einwenig zu lernen und zu begreifen, nimmt mir hoffentlich die evtl. dumme Frage nicht übel
[Menu]
0=Datei
1=Einstellungen
2=?
[File]
0=Öffnen
1=Beenden
Es existiert also eine Art Kategorie, gefolgt von Unterpunkten. Ich lese nun als jede Zeile ein und bearbeite diese, sofern sie in das Kategorie- oder Unterpunktmuster passt und steck sie in eine Hashtable. Das sieht dann "bildlich" so aus:
ht = [[Menu, [0, Datei]
[1,Einstellungen]
[2,?]],
[File, [0, Öffnen]
[1,Beenden]]
]
Da die Indizes nicht in folge kommen müssen oder nicht Null am Anfang sind, stecken auch die Unterpunkte in so einer Tabelle, sodass ich einen Eintrag über die beiden Schlüssel bekomme.
String category = null;
Hashtable<Integer, String> entries = new Hashtable<Integer, String>();
while ((line = br.readLine()) != null) {
if (line.trim().length() != 0) {
if (line.matches("\[(.+?)\]")) {
if (category != null && category.length() > 0 && !this.ht.containsKey(category) && entries.size() > 0) {
this.ht.put(category, entries);
entries = new Hashtable<Integer, String>();
}
category = line.replaceAll("\[(.+?)\]", "$1");
}
else if (line.matches("^([0-9]+)=(.+)")) {
entries.put(Integer.parseInt(line.replaceAll("^([0-9]+)=(.+)", "$1")), line.replaceAll("^([0-9]+)=(.+)", "$2"));
}
}
}
if (category != null && category.length() > 0 && !this.ht.containsKey(category) && entries.size() > 0)
this.ht.put(category, entries);
Hastable erzeugen und so ist alles klar. die line-matches habe ich noch nicht ganz verstanden und generell für was dieser Code gut sein könnte
grüße
Hi,
die line-matches habe ich noch nicht ganz verstanden
das ist das simple Parsing des Codes. Es wird versucht, auf diese Weise den Inhalt zu erkennen.
und generell für was dieser Code gut sein könnte
Es wird das uralte Ini-Format geparst und in eine besser analysierbare Objektstruktur gebracht. Leider ist das System reduziert auf die simpelste variante; es gibt beispielsweise keine Kommentare, und die einzelnen Werte können auch nicht in Quotes stehen.
Cheatah
Hi Cheatah,
vielen Dank.
die line-matches habe ich noch nicht ganz verstanden
das ist das simple Parsing des Codes. Es wird versucht, auf diese Weise den Inhalt zu erkennen.
Pasing, also mit Regulärem Ausdruck den Inhalt gematched, bzw. geschaut/geparsed. Oki Doki.
und generell für was dieser Code gut sein könnte
Es wird das uralte Ini-Format geparst und in eine besser analysierbare Objektstruktur gebracht. Leider ist das System reduziert auf die simpelste variante; es gibt beispielsweise keine Kommentare, und die einzelnen Werte können auch nicht in Quotes stehen.
Oki, ich schaue mir das heute abend noch viel genauer an und versuche das zu verstehen. passt zwar besser in den anderen Thread, aber dieses Ausdruck sieht etwas komisch aus?
if (line.matches("\[(.+?)\]")) {
\ ist vorne vor der Zeichenkette und hinten in der Zeichenkette maskiert im String.
Dann [] also Zeichen, dann wird das erste . nicht als Quantor genommen, sondern schon wärtlich als Punkt. (Gehe ich mal davon aus)
.+?
Dann das plus. (Der voranstehende Ausdruck muss mindestens einmal vorkommen, darf aber auch mehrfach vorkommen.) aber dahinter gleich ein Fragezeichen (Der voranstehende Ausdruck ist optional, er kann einmal vorkommen, muss es aber nicht, d. h. der Ausdruck kommt null- oder einmal vor)
Nicht komisch?
Mit Klammern wurde es halt noch gepsichert in $1. $0 war ja der gesamte Ausdruck.
Grüße
Hi,
Oki, ich schaue mir das heute abend noch viel genauer an und versuche das zu verstehen. passt zwar besser in den anderen Thread, aber dieses Ausdruck sieht etwas komisch aus?
ja, das liegt aber an einem ganz einfachen Umstand: Die Regular Expression wurde noch in einen String-Kontext gebracht (was in Java notwendig ist), also ein weiteres Mal kodiert.
\ ist vorne vor der Zeichenkette und hinten in der Zeichenkette maskiert im String.
Außerhalb des Strings ist es also ein einfacher Backslash.
Dann [] also Zeichen, dann wird das erste . nicht als Quantor genommen, sondern schon wärtlich als Punkt. (Gehe ich mal davon aus)
Nein, das Fragezeichen hinter "+" oder "*" entfernt dessen Greediness. Es ist hier noch immer das Pattern "." gemeint, also irgendein Zeichen außer Umbruch.
Cheatah
Hi,
ja, das liegt aber an einem ganz einfachen Umstand: Die Regular Expression wurde noch in einen String-Kontext gebracht (was in Java notwendig ist), also ein weiteres Mal kodiert.
ja genau. Eigentlich sieht dass dann so aus:
[(.+?)]
Nein, das Fragezeichen hinter "+" oder "*" entfernt dessen Greediness. Es ist hier noch immer das Pattern "." gemeint, also irgendein Zeichen außer Umbruch
Oki, auch innerhalb von [] sind . ? usw. Patterns.
Irgendwie macht mir das .+? dennoch keinen Sinn.
. Irgendein Zeichen, außer Umbruch
Das entfernen von Greediness habe ich nun nciht verstanden :(
Grüße