[RegEx] gesplittetes Zeichen behalten

DonMarcoHH

Aktives Mitglied
Moin,

jetzt mal eine vielleicht doch kompliziertere Frage (für die RegEx-Meister):
Ich hab folgenden Beispielcode:
Java:
String line = " String POL ;"
Die Leerzeichen sind dabei signifikant. Vor und nach dem
Code:
String
und vor und nach dem
Code:
POL
muss ein Leerzeichen sein. Nach diesem will ich jetzt splitten a lá:
Java:
String[] splitLine = line.split(" ");
Ich hab auch einen RegEx gefunden wodurch das letzte Leerzeichen behalten wird:
Java:
"(?<=[ ])"
Jedoch wird hierbei auch das erste Leerzeichen als eigenes Wort mitgenommen.
Also was ich habe:
Java:
String line = " String POL ;";
String[] splitLine = line.split("(?<=[ ])");
Ausgabe ist dabei:
Code:
splitLine[0] = " "
splitLine[1] = "String "
splitLine[2] = "POL "
Ich hätte aber gerne:
Code:
splitLine[0] = " String "
splitLine[1] = " POL "
 
wenn der input
Code:
" String  POL ;"
mit zwei leerzeichen dazwischen ist (wie du es auch schreibst aber nicht im code hast), könnte das vllt so gehen:

Java:
		Matcher m = Pattern.compile("\\s.*?\\s").matcher(" String  POL ;");
		while (m.find())
			System.out.println(m.group());
 
wenn der input
Code:
" String  POL ;"
mit zwei leerzeichen dazwischen ist (wie du es auch schreibst aber nicht im code hast), könnte das vllt so gehen:

Java:
		Matcher m = Pattern.compile("\\s.*?\\s").matcher(" String  POL ;");
		while (m.find())
			System.out.println(m.group());

Achso... ja das ist etwas unglücklich formuliert.
Zwischen jedem "Wort" muss ein Leerzeichen sein. Und jedes Wort muss nach dem Splitten immernoch von Leerzeichen umgeben sein! (Es ist also zwischen
Code:
String
und
Code:
POL
nur ein Leerzeichen, welches aber nach dem Split in beiden Gruppen auftauchen soll!)
 
die fragliche Methode ist letztlich folgende in Pattern:
Java:
    public String[] split(CharSequence input, int limit) {
        int index = 0;
        boolean matchLimited = limit > 0;
        ArrayList matchList = new ArrayList();
        Matcher m = matcher(input);

        // Add segments before each match found
        while(m.find()) {
            if (!matchLimited || matchList.size() < limit - 1) {
                String match = input.subSequence(index, m.start()).toString();
                matchList.add(match);
                index = m.end();
            } else if (matchList.size() == limit - 1) { // last one
                String match = input.subSequence(index,
                                                 input.length()).toString();
                matchList.add(match);
                index = m.end();
            }
        }

        // If no match was found, return this
        if (index == 0)
            return new String[] {input.toString()};

        // Add remaining segment
        if (!matchLimited || matchList.size() < limit)
            matchList.add(input.subSequence(index, input.length()).toString());

        // Construct result
        int resultSize = matchList.size();
        if (limit == 0)
            while (resultSize > 0 && matchList.get(resultSize-1).equals(""))
                resultSize--;
        String[] result = new String[resultSize];
        return (String[])matchList.subList(0, resultSize).toArray(result);
    }
die kannst du kopieren, unnötiges rausschmeißen und vor allem in der Schleife dann auch m.group() als das gemachte RegEx-Stück zum gefundenen match hinzufügen

edit: du kannst auch die Gruppen vor und nach beim aktuellen und nächsten Match hinzufügen usw.
 
Achso... ja das ist etwas unglücklich formuliert.
Zwischen jedem "Wort" muss ein Leerzeichen sein. Und jedes Wort muss nach dem Splitten immernoch von Leerzeichen umgeben sein! (Es ist also zwischen
Code:
String
und
Code:
POL
nur ein Leerzeichen, welches aber nach dem Split in beiden Gruppen auftauchen soll!)


dann hätte ich vllt noch das anzubieten 😀

Java:
	public static void main(String[] args) {
		Matcher m = Pattern.compile("\\s.*?\\s").matcher(" String POL String POL ;");
		for (int i = 0; m.find(i); i = m.end() - 1) {
			System.out.println(m.group());
		}
	}

edit: passt dann aber doch besser in eine for 🙂
 
Zuletzt bearbeitet:
die fragliche Methode ist letztlich folgende in Pattern:
[...]
die kannst du kopieren, unnötiges rausschmeißen und vor allem in der Schleife dann auch m.group() als das gemachte RegEx-Stück zum gefundenen match hinzufügen

edit: du kannst auch die Gruppen vor und nach beim aktuellen und nächsten Match hinzufügen usw.

Deine Zeile 5 macht mir Probleme. Was ist die Methode matcher(input)?! :rtfm:

EDIT:
Es gibt also keinen so genialen RegEx Ausdruck, wie ich ihn schon gefunden hab, der mir einfach noch nen Leerzeichen vor jedes Wort schreibt!?
Weil sonst kann ich auch einfach meinen nehmen und eine Schleife drüber laufen lassen:
Java:
for (int i = 0; i < splitLine.length; ++i){
splitLine[i] = " " + splitLine[i];
}
 
Zuletzt bearbeitet:
Pattern und Matcher sollte man schon gehört haben wenn man irgendwas mit RegEx in Java macht, die String-Methoden sind nur Abkürzung, die intern diese Klassen aufrufen,

ein RegEx kümmert sich überhaupt nicht um split, insofern kannst auf diesem direkten Wege nichts erwarten, nein
 
D
Es gibt also keinen so genialen RegEx Ausdruck, wie ich ihn schon gefunden hab, der mir einfach noch nen Leerzeichen vor jedes Wort schreibt!?
Weil sonst kann ich auch einfach meinen nehmen und eine Schleife drüber laufen lassen:
Java:
for (int i = 0; i < splitLine.length; ++i){
splitLine[i] = " " + splitLine[i];
}

wie slater schon gesagt hat, gibt es sowas direkt nicht. natürlich kannste auch einfach splitten und den whitespace wieder dranhängen. ich wüsst jetzt aber nichts, was gegen o.g. codeschnipsel einzuwenden ist.
 
wie slater schon gesagt hat, gibt es sowas direkt nicht. natürlich kannste auch einfach splitten und den whitespace wieder dranhängen. ich wüsst jetzt aber nichts, was gegen o.g. codeschnipsel einzuwenden ist.

Gegen oben genanntes Beispiel ist einzuwenden, dass mein Compiler mir bei folgender Methode:
[JAVA=5] Matcher m = matcher(input);
[/code] meldet, Methode "matcher(input) nicht bekannt!
 
weil dies Quellcode aus der Klasse Pattern ist, wenn du das woanders hast, brauchst du ein Pattern-Objekt p und musst p.matcher() aufrufen,
sämtliche Grundlagen zu so einem komplexen Thema mit zu erwähnen ist anstrengend
 
Weil matcher(input) eine Methode von der Klasse Pattern ist.

d.H. du brauchst das Object vom Typ Pattern

Java:
Pattern p = ........;
Matcher m = p.matcher(input)
 
weil dies Quellcode aus der Klasse Pattern ist, wenn du das woanders hast, brauchst du ein Pattern-Objekt p und musst p.matcher() aufrufen,
sämtliche Grundlagen zu so einem komplexen Thema mit zu erwähnen ist anstrengend

Jetzt nicht persönlich nehmen, aber woher soll ich denn wissen, dass du in der Klasse Pattern bist und man darin bleiben muss?! :bahnhof:
Mit rauskopieren dachte ich schon in meine Klasse, die ich da benutze.

Ich hab bisher nie mit Pattern/Matcher gearbeitet, sonst würde ich auch nicht so doof fragen... ???:L
 
Jetzt nicht persönlich nehmen,
keine Sorge
aber woher soll ich denn wissen, dass du in der Klasse Pattern bist
durch Lesen meines Postings:
die fragliche Methode ist letztlich folgende in Pattern:
😉
und man darin bleiben muss?! :bahnhof:
nun, das war das Grundwissen was ich angenommen hatte


Ich hab bisher nie mit Pattern/Matcher gearbeitet, sonst würde ich auch nicht so doof fragen... ???:L
dass du dich damit vorher auseinandersetzen solltest hatte ich dann auch schon geschrieben:
Pattern und Matcher sollte man schon gehört haben wenn man irgendwas mit RegEx in Java macht

-----

es ist wie es ist, sowas zu modifizieren sind letztlich zwar nur paar Zeilen, aber in der Gesamtheit doch relativ komplex,
erfordert Grundwissen zu Java einerseits und zu Pattern/ Matcher andererseits,

wenn du alternativ einfach ein Leerzeichen einfügen kannst oder der Code von nrg geht, dann ist das doch auch gut
 

Neue Themen


Zurück
Oben