Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ein Text File nach bestimmten Kriterien suchen:
1. Nur die Zeilen ausgeben, die das Wort "Hallo" beinhalten.
Das habe ich auch schon implementiert, was auch läuft
2. Nach Hallo steht immer eine bestimmte Nummer, jedoch in folgenden Formen:
Hallo\":\" 0123456789 \"
Also hier steht nach der Nummer: \"
oder:
Hallo= 0123456789,
Und hier steht nach der Nummer: ,
Nun möchte ich eine Liste machen mit den verschiedenen Nummern, die nach "Hallo" steht.
Wie bekomme ich nun nur die einzelnen Nummern als String ?
Aber genau für Probleme solcher Art verwendet man IMHO Regex... Es gibt viele Beispiele, bei denen man sich streiten kann, ob Regex das richtige oder falsche dafür ist - aber hier?
@internet: Das ist doch damit möglich, matcher.group(1) liefert dir diese Nummer. Kopier mein Beispiel und entferne aus dem System.out.println die Stelle: [c]"Hallo: " +[/c] und in der Konsole wird die Nummer ausgegeben.
Mit RegEx schafft man recht komplizierte Dinge, keine Frage. Nun sollen hier aber nun mal blos Zahlen an gewissen Stellen in einer Zeile einer Textdatei unbestimmter Grösse gefiltert werden. Warum sollte man sich dafür Unmengen der kompliziertesten Expressions ausdenken wollen? Etwa weil man es kann? :lol:
und was genau ist an \\d+ so kompliziert? Von Ausdenken kann auch nicht die Rede sein. Warum sollte man es tun? Weil es dafür geeignet ist. Man muss eben nur bereit sein, sich mit Regex auseinander zu setzen.
Jep, sieht so aus, auf den ersten Blick. Aber erstens, das was bei RegEx innerhalb des If-Blocks abläuft ist nicht weniger als beim Tokenizer und zweitens auf was wendest du das an? Lass mich raten: Auf einen String. Wenn nicht auf die gesammte Datei unbestimmter Länge, dann auf einzelne Zeilen. Im Gegensatz zum Tokenizer wird dadurch aber im ersten Fall der Speicher und im zweiten Fall mehr der GC durch ständiges "pattern.matcher(String text)" - es sei denn der Matcher wäre mutable - und der interne Stringbuffer belastet. Seh' ich das falsch?
Also, wenn es um das Suchen simpler Zahlen in einer Textdatei geht, ist man meiner Meinung nach immer noch mit RegEx sehr schlecht bedient. Andererseits ist der Tokenizer natürlich auch kein Allheilmittel. Was mal interessant wär, ein Tokenizer in welchem man nach verschiedenen Expressions suchen könnte.
[EDIT]Ok, Matcher ist mutable, durch "matcher.reset(Charsequence text)". Dennoch bleibt immerhin die Belastung des internen StringBuffers.[/Edit]
Natürlich ist die Laufzeit und die RAM-Belastung nicht zu vergleichen. Wie bereits gefühlte 1000 Mal besprochen: Man soll sich nicht Gedanken um einen Flaschenhals machen, wo es gar nicht notwendig ist.
kenne die interne Struktur von Regex nicht, von daher kann ich nicht viel dazu sagen. Wenn er aber eh das gleiche mit weniger Source macht, spricht das imho doch wiederrum für Regex.
und zweitens auf was wendest du das an? Lass mich raten: Auf einen String. Wenn nicht auf die gesammte Datei unbestimmter Länge, dann auf einzelne Zeilen.
...statt dessen ist es notwendig mit Kanonen auf Spatzen zu schiessen, weswegen man sich ein API schnappt, mit welchem sonst viel kompliziertere Dinge gelöst werden können, man aber damit als Anfänger noch nicht so Vertraut ist und sich erstmal einlesen muß. Ehrlich gesagt, der Aufwand wäre mir angesichts der Codekomplexität viel zu hoch. So richtig überzeugt mich da RegEx nicht wirklich.
Java:
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public final class RegExSearch
{
public static void main(String[] args)
throws Throwable
{
BufferedReader br = new BufferedReader(new FileReader("./test.txt"));
String line;
Matcher matcher = Pattern.compile("(\\d+)").matcher("");
while((line = br.readLine()) != null) {
matcher.reset(line);
if(matcher.find()) {
System.out.println("- " + matcher.group(1));
}
}
}
}
[EDIT]Was mir grad' bei dem verwendeten RegEx-Muster noch auffällt; Wo ist der Bezug zum Suchbegriff "Hallo"?[/EDIT]
Da ist kein bezug auf das Hallo, weil es nach der Fragestellung des TOs schlicht nicht notwendig war/ist. Anfangs ist Regex wirklich abschreckend, aber es ist eines der Dinge, die sich lohnen zu lernen. Zumal es nicht nur in Java vorteile bringt. Es hat mir schon oft beim Suchen von bestimmten Text-passagen in Editoren geholfen + beim Suchen/Ersetzen.
Oder auch in anderen Programmiersprachen...
@Spacerat: Ich sehe hier ebenfalls kein Grund, Regex anzuprangern. Wenn du es nicht magst, ok. Aber doch nicht hier darum diskutieren. Dein Alternativcode find ich aber super, so sieht der Anfänger, wie man es ohne Regex machen kann.
Ich sehe hier ebenfalls kein Grund, Regex anzuprangern. Wenn du es nicht magst, ok. Aber doch nicht hier darum diskutieren. Dein Alternativcode find ich aber super, so sieht der Anfänger, wie man es ohne Regex machen kann.
Das ist genau der Punkt. Natürlich kommt man hier da und dort an RegEx nicht vorbei, aber in diesem Fall. Wer hat eigentlich gesagt, dass ich RegEx nicht mag? Es ist hier halt nicht notwendig, den blutigen Anfänger mit solch' schweren Geschütz zu belasten.