Nummern/Text aus String bekommen

internet

Top Contributor
hallo zusammen,
ich möchte Folgendes tun:

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 ?

mfg
 
T

Tomate_Salat

Gast
Ich würde das mit Regex lösen (ungetestet): [c](\d*)[/c]. Dann einfach diese Gruppe zurückgeben lassen und ggf. noch als int parsen.
 

internet

Top Contributor
Leider kann ich dir nicht ganz folgen:
Hättest du ein Codebeispiel für mich?
Würde mir ungemein helfen.

Also int parsen muss nicht sein - String reicht vollkommen
 
T

Tomate_Salat

Gast
Java:
Matcher matcher=Pattern.compile("(\\d+)").matcher("Hallo\":\" 0123456789 \"");

if(matcher.find())
	System.out.println("Hallo: " + matcher.group(1));

Ergibt:
Code:
Hallo: 0123456789
 

internet

Top Contributor
dann habe ich mich wohl falsch ausgedrück.
Die Nummer kann immer anders sein.
Also zB 0323242349234

Aber es steht vor der Nummer immer entweder Hallo\":\" oder Hallo=

Jetzt möchte ich eben diese Nummer bekommen.
 
S

Spacerat

Gast
RegEx ist wie ein neuer Hammer was? Lässt alle Probleme wie Nägel aussehen.
@TS: Sieh' dir mal den StreamTokenizer an.
 

obb

Mitglied
Das ist im Prinzip nichts anderes als das was Tomate_Salat schon vorgeschlagen hat. Ich hoffe der Umgang mit
Code:
Pattern
und
Code:
Matcher
wird dadurch etwas klarer:

Java:
import java.util.LinkedList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class NummernExtrahieren {

	public static void main(String[] args) {
		LinkedList<Integer> nummernListe = new LinkedList<Integer>();
		
		// \\d+ : Eine oder mehrere Zahlen von 0 bis 9 hintereinander
		Pattern nummer = Pattern.compile("\\d+");
		
		String beispielText =
			"Hallo ohne Zahl\n"
			"TEXT Hallo\":\" 123 \" TEXT\n"
			"Hallo\":\" 321 \"\n"
			"TEXT Hallo= 456, TEXT\n"
			"Hallo= 654,";
		
		Matcher nummernSuche = nummer.matcher(beispielText);
		
		boolean nummerGefunden;
		String gefundeneNummer;
		
		do {
			nummerGefunden = nummernSuche.find();
			if(nummerGefunden) {
				gefundeneNummer = nummernSuche.group();
				nummernListe.add(Integer.parseInt(gefundeneNummer));
			}
		}while(nummerGefunden);
		
		ausgabe(nummernListe);
	}
	
	private static void ausgabe(LinkedList<Integer> liste) {
		System.out.println("Nummern in der Liste: \n");
		for(int nummer : liste)
			System.out.println("- " + nummer);
	}
}
 
T

Tomate_Salat

Gast
@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.
 
S

Spacerat

Gast
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:
 
T

Tomate_Salat

Gast
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.
 
S

Spacerat

Gast
Okay...
Java:
import java.io.FileReader;
import java.io.StreamTokenizer;

public final class StreamSearch
{
	public static void main(String[] args)
	throws Throwable
	{
		StreamTokenizer st = new StreamTokenizer(new FileReader("./test.txt"));
		int token;
		do {
			token = st.nextToken();
			if(token == StreamTokenizer.TT_WORD && "Hallo".equals(st.sval)) {
				do {
					token = st.nextToken();
					if(token == StreamTokenizer.TT_NUMBER) {
						System.out.println("- " + st.nval);
					}
				} while(token != StreamTokenizer.TT_EOF && token != StreamTokenizer.TT_EOL);
			}
		} while(token != StreamTokenizer.TT_EOF);
	}
}
;)
 
T

Tomate_Salat

Gast
... hier haben wir die Bestätigung:
Java:
Matcher matcher=Pattern.compile("(\\d+)").matcher(eingabe);
 
if(matcher.find()) { 
// ...
}

ist wesentlich kürzer,flexibler und verständlicher.
 
S

Spacerat

Gast
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]
 
Zuletzt bearbeitet von einem Moderator:

faetzminator

Gesperrter Benutzer
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.
 

Andi_CH

Top Contributor
Eine für einen Anfänger sicher wesentlich einfacher zu verstehende Lösung ...

Java:
public class ExtractNumbers {

	final static String anfang = "Hallo";
	final static char sep1 = ':';
	final static char end1 = '\\';
	final static char sep2 = '=';
	final static char end2 = ',';

	final static String[] input = {
		"Hallo:111\\blabla",
		"blubber Hallo=222,",
		"Hallo:333,", // ungültige Kombination
		"Hallo=444\\" // ungültige Kombination
	};

	private static String extract(String in) {
		int index1 = in.indexOf(anfang);
		int index2 = 0;
		index1 += anfang.length();
		char ch = in.charAt(index1);
		index1 += 1;
		if (ch == sep1) {
			index2 = in.indexOf(end1, index1);
		} else if (ch == sep2) {
			index2 = in.indexOf(end2, index1);
		} else {
			// keine Anfangsmarke gefunden
			return "";
		}
		if (index2 < index1) {
			// kein Abschlusscharacter gefunden
			return "";
		}
		return in.substring(index1, index2);
	}

	public static void main(String[] args) {
		for (String s : input)
			System.out.println(extract(s));
	}
}
 
T

Tomate_Salat

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

1. Nur die Zeilen ausgeben, die das Wort "Hallo" beinhalten.
Das habe ich auch schon implementiert, was auch läuft
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.
Laut der Vorgabe des TO's stellt sich mir die Frage nicht. Die Zeile aus der die Nummer gefiltert werden soll ist bereits bekannt.
 
S

Spacerat

Gast
...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]
 
Zuletzt bearbeitet von einem Moderator:
T

Tomate_Salat

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

faetzminator

Gesperrter Benutzer
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.
 
S

Spacerat

Gast
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
LiFunk Exception: es dürfen nur Nummern eingelesen werden Java Basics - Anfänger-Themen 6
Gaudimagspam Nummern generieren Array Java Basics - Anfänger-Themen 4
D Pentagonale Nummern in Rekursiv Java Basics - Anfänger-Themen 14
reza_4247 addieren Nummern Java Basics - Anfänger-Themen 7
U String.format (%s, %d) für Nummern Java Basics - Anfänger-Themen 37
L Nummern Generator (mit do-while Schleife) Problem Java Basics - Anfänger-Themen 7
S Bestimmte Anzahl an nummern auslesen Java Basics - Anfänger-Themen 4
S Nummern verschlüsseln, prüfen ob vorhanden in Datenbank Java Basics - Anfänger-Themen 2
N ISBN nummern überprüfen Java Basics - Anfänger-Themen 1
richis-fragen JTable effektiv angezeigter Text ausgeben nicht Inhalt vom Model Java Basics - Anfänger-Themen 9
A Edit Text Negative Decimalzahlen Java Basics - Anfänger-Themen 18
P Aus Text Datei nur Zahlen übernehmen Java Basics - Anfänger-Themen 13
T Text einlesen code was kommt dahin? Java Basics - Anfänger-Themen 1
R Text in der DB abspeichern, und danach bearbeiten Java Basics - Anfänger-Themen 5
A JTextArea entfernen und durch neuen Text ersetzen Java Basics - Anfänger-Themen 8
JavaBeginner22 Button Text verändern Java Basics - Anfänger-Themen 1
GoenntHack Java Text von JLabel verändert sich nicht Java Basics - Anfänger-Themen 1
A Text zu Morsecode Java Basics - Anfänger-Themen 8
O Java Text Area Zeilenausgabe Java Basics - Anfänger-Themen 7
M Text wird in der Console nicht ausgegeben. Java Basics - Anfänger-Themen 11
berserkerdq2 An selbst ersteller txt Datei immer Text dranhängen, ohne den vorherign Text zu löschen Java Basics - Anfänger-Themen 8
M Text in Datei schreiben Java Basics - Anfänger-Themen 9
T208 Text Datei individuell benennen. Java Basics - Anfänger-Themen 5
A Werten aus dem Text ausliesten Java Basics - Anfänger-Themen 6
K Jlabel mit itemlistevent Text gegeben, wird nicht angezeigt Java Basics - Anfänger-Themen 5
Kiki01 Wie würde eine geeignete Schleife aussehen, die die relative Häufigkeit für jeden Charakter in einem Text bestimmt? Java Basics - Anfänger-Themen 3
O Text mit Regex trennen und wieder zusammenbauen Java Basics - Anfänger-Themen 5
xFlozen Text mehrspaltig ausgeben Java Basics - Anfänger-Themen 3
S Zufällige ungerade Zeile aus Text-Datei lesen Java Basics - Anfänger-Themen 5
K Rekursiver Vergleich von Textmuster und Text Java Basics - Anfänger-Themen 2
C Variablen Provided text for message may not be null Java Basics - Anfänger-Themen 9
H Klassen Die Länge einer Text-Node bestimmen Java Basics - Anfänger-Themen 2
F Erste Schritte java.util.Scanner: Beliebig langen Text per Paste in Console eingeben ? Java Basics - Anfänger-Themen 14
GermanPie Discord Text Channel erstellen? Java Basics - Anfänger-Themen 1
C JButton Text 2 Mal ändern funktioniert nicht Java Basics - Anfänger-Themen 8
yoskaem Text Color durch Klicken eines Buttons in anderer Activity ändern Java Basics - Anfänger-Themen 2
B Alle Links in einem Text suchen und ersetzen mit einem neuen Link Java Basics - Anfänger-Themen 18
J Java TextArea Text bei hinzufügen makieren Java Basics - Anfänger-Themen 1
T Text-Ausgabe für Textadventure - Organisation Java Basics - Anfänger-Themen 5
G Anklickbaren Text erzeugen Java Basics - Anfänger-Themen 2
B Text-Datei nur in Stream speichern und dann ausgeben Java Basics - Anfänger-Themen 3
M Java: BufferedReader liest nur die Hälfte der Text-Datei. Java Basics - Anfänger-Themen 4
M Apache POI PPT - Vertikales Alignment von Text im XSLFAutoShape Java Basics - Anfänger-Themen 2
I Nur auf Abfrage von einer Text Datei einlesen Java Basics - Anfänger-Themen 11
P Text Datei einlesen und übertragen Java Basics - Anfänger-Themen 15
P Taschenrechner Text übertragung Java Basics - Anfänger-Themen 3
J java.text.DecimalFormat Java Basics - Anfänger-Themen 5
AnnaBauer21 GridBagLayout JLabel weightx: Unterschiedliche Breite mit & ohne Text Java Basics - Anfänger-Themen 6
K Durch eine Text eingabe etwas Ausführen Java Basics - Anfänger-Themen 5
S Text-To-Speech mit Java Java Basics - Anfänger-Themen 2
L Text-Adventure Java Basics - Anfänger-Themen 3
M Input/Output Java Swing: Prüft ob Text aus JTextField ausschließlich Integer enthält Java Basics - Anfänger-Themen 15
ruutaiokwu Ausgegebene Zeile ersetzen mit neuem Text Java Basics - Anfänger-Themen 3
tsom Erste Schritte itext Text als Block auf neue Seite Java Basics - Anfänger-Themen 0
Dimax Programme ,als Text in MySql speichern Java Basics - Anfänger-Themen 7
CptK Datentypen Text Dateien einlesen Java Basics - Anfänger-Themen 3
Harlequin Compiler-Fehler Text Adventure - "Long Output" Fehler Java Basics - Anfänger-Themen 3
S Zeichen zählen kopierter Text Java Basics - Anfänger-Themen 6
D Text als Code in java-forum.com formatieren. Wie ? Java Basics - Anfänger-Themen 3
F Schreibprogramm nur markierten Text in kursiv oder fett schreiben Java Basics - Anfänger-Themen 3
A Rechnen mit Text und Zahl Java Basics - Anfänger-Themen 4
MaximilianTM Input/Output Einlesen und bearbeiten einer text Datei / Zeile Java Basics - Anfänger-Themen 5
M Erste Schritte Verschlüsselung von text Java Basics - Anfänger-Themen 21
S Text aus einer HTML Datei auslesen Java Basics - Anfänger-Themen 1
S Java Text splitten mit Tabs, Zeilen, Zeichen und Klammern. Java Basics - Anfänger-Themen 6
M Beliebigen Text in *** umwandeln Java Basics - Anfänger-Themen 15
K (JTable) Text einer Zelle auf der linken Seite kürzel Java Basics - Anfänger-Themen 2
H Suche in Text und Markierung Java Basics - Anfänger-Themen 14
H Suche in einem Text Java Basics - Anfänger-Themen 17
F Input/Output Text einlesen lassen Java Basics - Anfänger-Themen 14
L Text eingeben und im Textfeld auslesen lassen Java Basics - Anfänger-Themen 2
R Best Practice Palindrom in einem Text finden Java Basics - Anfänger-Themen 18
J Text Datei einlesen Java Basics - Anfänger-Themen 6
L Text und Ganzzahl in einer Dialogbox Java Basics - Anfänger-Themen 5
D Text Adventure Erstellen Java Basics - Anfänger-Themen 10
T Jlabel durch Text in 2 anderen Jlabels sichtbar machen Java Basics - Anfänger-Themen 4
J JTextArea visible ohne Text Java Basics - Anfänger-Themen 3
D Bild zu Text Java Basics - Anfänger-Themen 4
L Text/Befehle zu Programmen senden Java Basics - Anfänger-Themen 1
L Java Text datei nur bis zu einem Punkt auslesen? Java Basics - Anfänger-Themen 3
T Classpath Problem mit dem auslesen von Text-Dateien (Pfad) Java Basics - Anfänger-Themen 3
S Erste Schritte Sprachermittler - Datei öffnen, Text in TextArea, Bereinigen, Auswerten Java Basics - Anfänger-Themen 14
S Java Label hat komischen text Java Basics - Anfänger-Themen 4
F Text anhand bestimmter Trennzeichen in Textteile trennen (netbeans) Java Basics - Anfänger-Themen 7
S Ausgabe von Text Formatieren Java Basics - Anfänger-Themen 6
H Text in einen Button quetschen Java Basics - Anfänger-Themen 3
A Text mit "Scanner" eingeben und Umlaute ersetzen Java Basics - Anfänger-Themen 7
A Text teilen und Wörter zählen Java Basics - Anfänger-Themen 7
J Zahlen als Text übersetzen Java Basics - Anfänger-Themen 6
F Erste Schritte Label Text vor Methodenaufruf setzen Java Basics - Anfänger-Themen 17
R Text Pane Aktualisierung erst nach JOptionPane Java Basics - Anfänger-Themen 10
I BufferedReader Text-Datei einlesen??? Java Basics - Anfänger-Themen 1
S Wort in Text suchen und ersetzen Java Basics - Anfänger-Themen 3
V Interface ich schäme mich das zu fragen, aber ich schaff nicht ein Text zu zentrieren :( [javaFX] Java Basics - Anfänger-Themen 6
M Input/Output Text auf Fenster zeichen Java Basics - Anfänger-Themen 2
W Klassen Fehler bei public void setLabelText(JLabel label, String text) Java Basics - Anfänger-Themen 11
Chava Testprojekt.Text.Image.Button Java Basics - Anfänger-Themen 4
Z JSlider - Text wird nich angezeigt Java Basics - Anfänger-Themen 0
A Problem mit set.Text und übergabe Java Basics - Anfänger-Themen 2
A Probleme mit equals und get.Text Java Basics - Anfänger-Themen 12

Ähnliche Java Themen

Neue Themen


Oben