Strings mit regulären Ausdrücken filtern und weiterverwenden

Volti

Mitglied
Hallo,

ich brauche, wie fast jeder, der ein Thema erstellt, einen Rat.

Ich habe bereits einen Text aus einer Datei eingelesen, in einen String umgewandelt und mithilfe von einigen regulären Ausdrücken unerwünschte Zeichen rausgeschmissen.
Nun schaut mein Text formal etwa so aus.
Code:
   label1:   text1      label2: text2                label3:                   text3    label4: usw.

Ich habe nach jedem label, was also einen bestimmten Ausdruck darstellen kann ( z.B. "Preis:") eine unbestimmte Anzahl an whitespaces oder Tabulatoren. Darauf folgt ein Text, den ich gerne herausfltern möchte. Hierauf folgen dann wieder whitespaces und tabs bis zum nächsten label.

Wofür das Ganze?

Ich habe ein Objekt, dessen Attribute die Label vom Typ String sind, die den dazugehörigen Text beinhalten.
z.B. private String label1 hält text1
Die entsprechenden Namen für die label sind mir bereits bekannt und brauchen nicht "automatisch" erkannt werden.

Es ist kein Problem für mich, ein Muster einfach durch etwas anderes zu ersetzen, ich komme nur nicht darauf einen Text zwischen zwei anderen Mustern herauszugreifen und zu bereinigen.

Ein bisschen Starthilfe wäre also wirklich nett. Danke!
 
Meinst du sowas?
Java:
package de.tutorials.volti;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TextParserSample {
	public static void main(String[] args) {
		String str = "   label1:   text1      label2: text2                label3:                   text3    label4: usw.";

		Map<String, String> results = parseString(str);
		printOutput(results);
	}

	public static Map<String, String> parseString(String str) {
		Map<String, String> results = new HashMap<String, String>();
		Pattern p = Pattern.compile("([a-zA-Z0-9]+):[ ]*([a-zA-Z0-9]+)");
		Matcher m = p.matcher(str);

		while(m.find()) {
			results.put(m.group(1), m.group(2));
		}

		return results;
	}

	public static void printOutput(Map<String, String> map) {
		Iterator<String> it = map.keySet().iterator();

		while(it.hasNext()) {
			String key = it.next();
			System.out.println(key + " => " + map.get(key));
		}
	}
}

Output:
Code:
label1 => text1
label2 => text2
label3 => text3
label4 => usw
 
wow, mit so einer schnellen und ausführlichen Antwort hätte ich jetzt nicht gerechnet, vor allem nicht mit Code.

Ich werde mal ein bisschen damit rumspielen und vorallem versuchen, das so gut zu verstehen, dass ich sowas auch wieder reproduzieren könnte.

Danke!
 
Hallo zusammen,

kleiner Tipp am Rande in diesem Zusammenhang!

Wir nutzen hier in der Firma zum Testen von regulären Ausdrücken das nette kleine
Tool "RegEx coach"! Es kann zusammen mit seiner Doku hier runtergeladen werden:
http://weitz.de/regex-coach ("Windows installer" oder "Linux tar archive")

Es eignet sich auch gut zur Einarbeitung in dieses Thema!

Eine weitere gute Übersicht zu den Java Pattern liefert diese Seite:
http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html

Gruß
Klaus
 
Danke für die Links!

Ich hab jetzt auch schon eine Lösung gefunden, die zumindest mal das tut, was sie tun soll^^

Ich werde bei Gelegenheit noch mal kurz darauf eingehen.
 
So, die Sache war dann eigentlich relativ einfach. Elegant wahrscheinlich nicht wirklich.^^

Ich wusste ja, dass auf jeden Fall "label2" auf "label1" folgte. So habe ich zwei Pattern gebildet. Das eine sucht nacht "label1:", das andere nach "label2.". Nun kann man ja mit z.B. p1.end() (nachdem man p1.find() ausgeführt hat), die Endposition von Pattern 1 im Eingabestring herausfinden. p2.start() macht das analog nur mit Startposition.
Letztendlich habe ich mir dann den Substring liefern lassen, den ich dann nur noch normalisieren (Tabs und whitespace an Anfang und Ende weg) musste.

Das sah dann in etwa so aus:
Code:
Matcher label1 = Pattern.compile("label1:").matcher(eingabestring)
Matcher label2 = Pattern.compile("label2:").matcher(eingabestring)
label1.find();
label2.find();
String ausgabe = eingabestring.substring(label1.end(),label2.start());
//dann noch normalisieren...etc.
 

Neue Beiträge

Zurück