Mit String.split String unterteilen

meddins

Grünschnabel
Hallo,

ich versuche zur Zeit verzweifelt mit regulären Ausdrücken einen String zu unterteilen. Ich komme aber einfach nicht weiter. Mein String ist folgendermaßen aufgebaut:
[Typ][_id][Text][Typ][_id][Text][Typ][][Text]
Ich möchte den String eigentlich in zwei Schritten unterteilen. Zuerst möchte ich einen Array aus Strings in folgender Form haben:[Typ],[_id],[Text] und anschließend einen Array, der jeweils eines der Elemente ohne Eckige Klammern enthält. Dabei kann es passieren, dass _id leer ist. Also Typ,_id,Text

Das einzige was ich jedoch mit String.split zustande bringe ist ein eindimensionaler Array aus Strings, die jeweils so aussehen: [Typ,[_id,[Text,[Typ,[_id,...

Hat da jemand einen Rat für mich?

Gruß meddins
 
Moin,
schwer zu sagen ... wie splittest Du denn ? :confused:
Poste mal den entsprechenden Code ....

Kleiner Tipp schon mal 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
 
Moin,

wenn ich Dich richtig verstehe, stehe die eckigen Klammern mit im String ? ? ? :confused:

Dann könnte Dir sowas helfen :
Java:
String strDeinString = "[Typ][_id][Text][Typ][_id][Text][Typ][][Text]";

static final String STRPATTERN = "][";

Pattern p = Pattern.compile( STRPATTERN );
String[] strData = p.split( strDeinString, 0 );

// sollte sowas ergeben:
// strData[0] = "[Typ"
// strData[1] = "_id"
// strData[2] = "Text"
// strData[3] = "Typ"
...
// strData[7] = "Text]"

Dann musst nur noch im ersten und letzten Element die Klammern entfernen und fertig!

Ist aber ungetestet !! :p

Gruß
Klaus


[EDIT]: ach so, ggf. fehlt Dir noch <import java.util.regex.*;>
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

wenn ich Dich richtig verstehe, stehe die eckigen Klammern mit im String ? ? ?
ja, die eckigen Klammern stehen mit im String drinne.

static final String STRPATTERN = "][";
Sowas hatte ich auch schon probiert. Man muss aber die Klammern escapen. Fand das aber nicht ganz so schön.

Als Keyword würde ich dir StringTokenizer() geben und diesen Link:
http://www.addison-wesley.de/service...r/kap12005.htm
Bei StringTokenizer ist das Problem, dass er nur ein Zeichen als Trennzeichen verwendet oder? Deswegen wollte ich es mit regulären Ausdrücken versuchen.

Ich dachte, dass man String.split einen regulären Ausdruck übergeben kann, der beinhaltet, dass ein Element mit "[" startet, dazwischen beliebige Zeichen hat und mit "]" endet. Aber wenn ich irgendwas in der Richtung "[\\[.*\\]]?" Übergebe, dann bekomme ich immer jeden Buchstaben einzeln oder den kompletten String zurück.
 
Zuletzt bearbeitet:
Sowas hatte ich auch schon probiert. Man muss aber die Klammern escapen. Fand das aber nicht ganz so schön.

Moin,

stimmt, das Escapen hatte ich vergessen :-(
Aber warum sollte es unschön sein ? ? ? :confused:

Das klappt wunderbar [EDIT: hab's just getestet :)]...

Java:
String strDeinString = "[Typ][_id][Text][Typ][_id][Text][Typ][][Text]";
 
static final String STRPATTERN = "\\]\\[";
 
Pattern p = Pattern.compile( STRPATTERN );
String[] strData = p.split( strDeinString, 0 );
 
// Ergebnis :
// strData[0] = "[Typ"
// strData[1] = "_id"
// strData[2] = "Text"
// strData[3] = "Typ"
// strData[4] = "_id"
// strData[5] = "Text"
// strData[6] = "Typ"
// strData[7] = ""
// strData[8] = "Text]"

Ich denke mal, wenn man das Pattern noch ein wenig aufschlaut, kann man auch die beiden Klammern sowie den leeren String rauskegeln!

Gruß
Klaus
 
Zuletzt bearbeitet:
So gehts auch ganz gut und es kann was beliebiges zwischen ] und [ stehen da find den nächsten Match sucht.

Java:
public static void main(String[] args) {
	String strDeinString = "[Typ][Second]";

	final String OPEN = "\\[";
	final String CLOSE = "\\]";
	final String NO_BRACKET = "[^" + OPEN + CLOSE + "]";
	final String ONE_MATCH = OPEN + "(" + NO_BRACKET + "*)" + CLOSE;

	final Pattern pattern = Pattern.compile(ONE_MATCH);
	final Matcher matcher = pattern.matcher(strDeinString);

	while (matcher.find( )) {
		System.out.println(matcher.group(1));
	}
}
 
So gehts auch ganz gut und es kann was beliebiges zwischen ] und [ stehen da find den nächsten Match sucht.

java Code:
public static void main(String[] args) {

&nbsp;&nbsp;&nbsp;&nbsp;String strDeinString = "[Typ][Second]";



&nbsp;&nbsp;&nbsp;&nbsp;final String OPEN = "\\[";

&nbsp;&nbsp;&nbsp;&nbsp;final String CLOSE = "\\]";

&nbsp;&nbsp;&nbsp;&nbsp;final String NO_BRACKET = "[^" + OPEN + CLOSE + "]";

&nbsp;&nbsp;&nbsp;&nbsp;final String ONE_MATCH = OPEN + "(" + NO_BRACKET + "*)" + CLOSE;



&nbsp;&nbsp;&nbsp;&nbsp;final Pattern pattern = Pattern.compile(ONE_MATCH);

&nbsp;&nbsp;&nbsp;&nbsp;final Matcher matcher = pattern.matcher(strDeinString);



&nbsp;&nbsp;&nbsp;&nbsp;while (matcher.find( )) {

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(matcher.group(1));

&nbsp;&nbsp;&nbsp;&nbsp;}

}


Moin,

habe diese Lösung gerade mal schnell getestet und sie klappt sehr hervorragend !!
Genau das, was Du gesucht hast :)

Gruß
Klaus


[EDIT] oops, da hat das "Zitieren" wohl ein Mist mit dem HTML-Format gebaut ..... :-(
 
In der Schule hatte mein Dozent mal ein ähnlcihes Beispiel angebracht und meinte dann sinngemäß:

nimm replaceAll() und ersetze alle "][" durch "];[" und splitte dann bei ";"...

find ich persönlich auch nicht so toll, weil die Strings selber ja auch ";" enthalten könnten, aber manche machen es so ^^
 

Neue Beiträge

Zurück