Split() Methode funktioniert nicht?!

Tabkas

Mitglied
Hey,
ich habe einen sehr langen String, der HTML-Code repräsentiert. In diesem möchte ich nun String.split() ausführen.

Es funktioniert aber nicht! Der resultierende Array hat immer genau die Länge 1.

Ich habe geprüft, ob er denn wenigstens erkennt, dass das regex im String enthalten ist und contains liefert true. Und es ist nicht am Ende enthalten.

Daher, wieso hat wird der String nicht gespalten?! Wieso hat der Array nur genau 1 Element...

Ich verstehe das nicht.

Liegt es vlt. an der Länge des Strings? Gibt es Alternativen? Wie ist das Problem zu lösen?

Vielen vielen Dank!
Tabkas
 

mihe7

Top Contributor
Daher, wieso hat wird der String nicht gespalten?! Wieso hat der Array nur genau 1 Element...
Mit an Sicherheit grenzender Wahrscheinlichkeit, weil Du etwas falsch gemacht hast. Man könnte jetzt die Vermutung anstellen, dass es mit der Angabe des regulären Ausdrucks zu tun hat, aber wir wollen es mal nicht übertreiben :)
 

Tabkas

Mitglied
Hier die Methode. Es geht darum die Zeichen zwischen zwei bestimmten Zeichen zu ersetzen:

public static String ersetzeMitte(String text, String einsetzen, String anfang, String ende) {
if(!text.contains(anfang) || !text.contains(ende)) {return text;}
String rueck = "";

String[] liste = text.split(anfang);
rueck += liste[0];

rueck += einsetzen;

String zweiterTeil = liste[1];
rueck += zweiterTeil.split(ende)[1];

return rueck;
}

Es ist unsauber programmiert, ja. ZB hätte vor zweiterTeil.split(ende)[1] noch eine Abfrage gemusst, ob dieses Element überhaupt existiert. Analog bei liste[1]. Ich habe darauf verzichtet, da dies in meiner Anwendung mit Sicherheit nicht vorkommt, und wenn, behandle ich es als Ausnahme.

Die Eingabe der Aktualparameter erfolgt auch in der richtigen Reihenfolge, mehrmals geprüft.

text ist ein sehr langer HTML-Code
einsetzen ist ein kurzer neuer Produkttitel
anfang ist dabei: "<!--[PRODUKTTITEL-START]-->"
ende ist dabei: "<!--[PRODUKTTITEL-ENDE]-->"

Fehlercode:
java.lang.ArrayIndexOutOfBoundsException: 1
at zeichenkette.Bearbeiten.ersetzeMitte(Bearbeiten.java:37)

Das heißt der String wird nicht in 2 Teile gespalten bei "<!--[PRODUKTTITEL-START]-->". Obwohl das im String vorkommt und auch nicht erst am Ende, sondern mittendrin.

Wieso?

Vielen Dank!
 

Robat

Top Contributor
Das Problem wird wohl sein, dass deine beiden Suchstrings vordefinierte Zeichen in regulären Ausdrücken enthalten. (zum Beispiel []... gleiches gilt für Bindestrich und spitze Klammern <>)
Versuch sowohl anfang als auch ende mal mit Pattern.quote(String) zu escapen. Dabei werden alle vordefinierten Zeichen als "normale" Zeichen interpretiert.
 

Tabkas

Mitglied
Achso! Ich verstehe, ich werde dies heute Abend probieren, sobald möglich.

Ich verstehe richtig, dass Pattern.quote(...), was "\Q" und "\E" hinzufügt, nichts anderes tut, als dafür zu sorgen, dass der String, der übergeben wurde so gelesen wird, wie er geschrieben ist und nicht bestimmte Teile als vordefinierte Zeichen interpretiert werden?

Dankeschön!
 
K

kneitzel

Gast
Generell könnte man auch auf Split verzichten und einfache indexOf Aufrufe nutzen um dann im Anschluss substring zu nutzen.

Oder da es ja um das Ersetzen einer Zeichenkette geht natürlich ein replaceAll bzw replaceFirst Aufruf wobei dann das gesuchte Pattern halt Pattern.quote(anfang) + “.*“ + Pattern.quote(ende) wäre ... statt dem .* evtl. eingrenzen, was alles drin vorkommen darf, aber wenn es genau ein mal vorkommen kann ist .* ok.
 

mihe7

Top Contributor
Generell könnte man auch auf Split verzichten und einfache indexOf Aufrufe nutzen um dann im Anschluss substring zu nutzen.
Java:
    public static String replaceAllBetween(String text, String begin, String end, String replacement) {
        int pos = 0;
        int left;
        StringBuilder b = new StringBuilder();
        while ((left = text.indexOf(begin, pos)) != -1) {
            left += begin.length();
            b.append(text.substring(pos, left));
            pos = left;

            int right = text.indexOf(end, left);            
            if (right != -1) {
                b.append(replacement);
                pos = right;
            }
        }
        b.append(text.substring(pos));
        return b.toString();
    }
 
K

kneitzel

Gast
Danke, aber wie am Ende gesagt: String hat eine replace Funktion, die man dann ja nutzen kann:
Java:
  public static String replaceAllBetween(String text, String begin, String end, String replacement) {
    return text.replaceAll(
                   Pattern.quote(begin) + ".*?" + Pattern.quote(end),
                   begin+replacement+end
           );
  }

Ich war mir jetzt nur nicht sicher, ob die Zeichenketten begin und end erhalten bleiben sollten. Von der Benennung her hörte es sich danach an, daher habe ich diese auch drin gelassen....

Das .* kann bei mehreren Vorkommen natürlich recht hart sein, da es ja "greedy" ist, d.h. so viel nimmt wie nur möglich. Bei mehreren Vorkommen würde es also vom ersten anfang bis zum letzten ende alle nehmen. Daher das .*?, so dass es eben dieses Verhalten nicht mehr zeigt.

Und dann einfach einmal ein Test:
Java:
import java.util.regex.Pattern;

public class Test {
  public static void main(String[] args) {
    System.out.println(replaceAllBetween(
        "Das steht davor<!--[PRODUKTTITEL-START]-->Innen Drin ist dies   <!--[PRODUKTTITEL-ENDE]-->Und danach kommt auch noch was ...<!--[PRODUKTTITEL-START]-->Zweites Innen Drin ist dies   <!--[PRODUKTTITEL-ENDE]-->Ganz am Ende",
        "<!--[PRODUKTTITEL-START]-->",
        "<!--[PRODUKTTITEL-ENDE]-->",
        "lalala"));
  }

  public static String replaceAllBetween(String text, String begin, String end, String replacement) {
    return text.replaceAll(
                   Pattern.quote(begin) + ".*?" + Pattern.quote(end),
                   begin+replacement+end
           );
  }
}

Code:
c:\Projects>javac Test.java

c:\Projects>java Test
Das steht davor<!--[PRODUKTTITEL-START]-->lalala<!--[PRODUKTTITEL-ENDE]-->Und da
nach kommt auch noch was ...<!--[PRODUKTTITEL-START]-->lalala<!--[PRODUKTTITEL-E
NDE]-->Ganz am Ende

c:\Projects>
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K String split Methode Allgemeine Java-Themen 20
O Split methode tut bei Zeichen "\", "\\" Allgemeine Java-Themen 7
A Split() - Methode und java.util.regex.* Allgemeine Java-Themen 2
SaschaMeyer Arbeitet String.split falsch? Allgemeine Java-Themen 4
R Variablen String mit split-Funktion aufteilen Allgemeine Java-Themen 7
S Variablen split-Funkton mit zwei Variabeln verwenden? Allgemeine Java-Themen 4
OnDemand String Split Pipe Allgemeine Java-Themen 2
S String split mit spez. Regexp Allgemeine Java-Themen 2
L Split String Level 100 Allgemeine Java-Themen 2
Y Kleine Frage zu String.split Allgemeine Java-Themen 3
M split("("); Problem Allgemeine Java-Themen 4
A String.split() funktioniert nicht richtig Allgemeine Java-Themen 4
Q String Split() Allgemeine Java-Themen 46
AMStyles Split bei hälfte Allgemeine Java-Themen 3
O split mit einem ODER mehrere Tabulatoren oder Leerzeichen Allgemeine Java-Themen 6
A Split, Scanner, StringTokenizer oder PatternMatching für flexibles Dateieinlesen? Allgemeine Java-Themen 2
S indize statt split() Allgemeine Java-Themen 10
D String split() ist unlogisch Allgemeine Java-Themen 12
V Problem mit der String.split() Allgemeine Java-Themen 3
G Split mit ; und " Allgemeine Java-Themen 4
R Sting.split() was mache ich falsch? Allgemeine Java-Themen 5
Daniel_L Frage zu split() und dem Trennzeichen. Allgemeine Java-Themen 10
C String split Allgemeine Java-Themen 3
GilbertGrape Frage zu split Allgemeine Java-Themen 2
C "/" in String.split()-->Illegal escapesequence Allgemeine Java-Themen 5
G split() mit komma/punkt funktioniert nicht Allgemeine Java-Themen 16
W string.split("") warum funzt des net? Allgemeine Java-Themen 5
T String.split() - viel zu langsam Allgemeine Java-Themen 9
G Split String Array bringt Fehlermeldung Allgemeine Java-Themen 7
P split() und ich versteh die Welt nicht Allgemeine Java-Themen 2
foobar Split Int Allgemeine Java-Themen 4
R String.split - ich steh auf dem Schlauch. Allgemeine Java-Themen 3
V Probleme mit String.Split :/ Allgemeine Java-Themen 2
I Split aus "JBuilder 2005" Allgemeine Java-Themen 15
B String.split() --- Java1.3 Allgemeine Java-Themen 10
K String.split nachbauen Allgemeine Java-Themen 7
P String.split will nicht Allgemeine Java-Themen 3
N Split -> IF-String vergleich Allgemeine Java-Themen 5
S Seltsames Verhalten von split() Allgemeine Java-Themen 3
P string.split() & RegEx Allgemeine Java-Themen 3
G Alternative zu split() Allgemeine Java-Themen 3
M Pattern, Matcher, Split Allgemeine Java-Themen 2
D split(".") funktioniert net Allgemeine Java-Themen 3
W Hilfe bei Methode Allgemeine Java-Themen 14
Ü Methoden Arrays vergleichen - Methode Allgemeine Java-Themen 1
Simon16 compareTo Methode überschreiben Allgemeine Java-Themen 4
TheSkyRider Methode über DataInputStream "auslösen" Allgemeine Java-Themen 6
M CrudRepository save Methode mocken Allgemeine Java-Themen 6
thor_norsk toString() - Methode Allgemeine Java-Themen 6
A Clean Code: Variable vs. Methode Allgemeine Java-Themen 8
Encera Zweite Main-Methode zuschalten Allgemeine Java-Themen 18
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
I Hibernate Envers - Aufruf der Methode zum Speichern selbst ausführen oder managen? Allgemeine Java-Themen 0
N rekursion mehrfach eine Methode Öffnen Allgemeine Java-Themen 4
berserkerdq2 Wenn ich eine Methode nur jede 50ms ausführen will, wie mach ich das? Allgemeine Java-Themen 4
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
N Schnellste Methode, ein Array durchzugehen? Allgemeine Java-Themen 9
E Methoden abstract static Methode Allgemeine Java-Themen 8
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
F Getter Methode aufrufen funktioniert nicht Allgemeine Java-Themen 1
B In Java Methode mit generic input und output basteln? Allgemeine Java-Themen 4
goldmensch Datentypen Welche Methode hat die bessere Performance? Allgemeine Java-Themen 12
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
T C++ Methode Übersetzung in Java Allgemeine Java-Themen 3
L Erste Schritte TDD testen einer Methode mit injezierten Services? Allgemeine Java-Themen 12
R @author vor Methode (eclipse) Allgemeine Java-Themen 1
J RotSchwarzBaum: Löschen mittels insert-Methode Allgemeine Java-Themen 20
Y Java Bruttoberechnen + runden Methode Allgemeine Java-Themen 1
R Warum ist die Methode unendlich oft rekursiv? Allgemeine Java-Themen 5
R Methoden Was fehlt mir bzw. muss ich bei der Methode countHarshabNumbers ändern damit ich die Harshad Zahlen im Intervall [51, 79] zählen kann? Allgemeine Java-Themen 19
D ArrayListe delete Methode klappt nicht Allgemeine Java-Themen 12
Drachenbauer Wie finde ich den Aufrufer zu einer Methode, die sich nicht in meinem Projekt befindet? Allgemeine Java-Themen 2
A Ist ein enum hier richtig? Enum toString() Methode. Allgemeine Java-Themen 1
Scream_ilias brute force methode verbessern? Allgemeine Java-Themen 6
Scream_ilias passwort meines pc per brute force methode knacken Allgemeine Java-Themen 4
S static methode im Interface Allgemeine Java-Themen 1
M Konstruktor einer Methode Allgemeine Java-Themen 35
A HashMap Methode "get()"-Problem Allgemeine Java-Themen 28
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
T Sinn einer toString Methode Allgemeine Java-Themen 3
L Methoden Über Reflections eine Methode mit aufrufen Allgemeine Java-Themen 3
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
L ToString-Methode Allgemeine Java-Themen 6
X Datentypen NPE in längerer Methode Allgemeine Java-Themen 12
I Methoden Generics-Methode Allgemeine Java-Themen 3
H Strategy Pattern - changeColor() Methode - input rgd oder hex einlesen Allgemeine Java-Themen 1
T statische Variable und nicht-statische Methode Allgemeine Java-Themen 2
B Aufruf der Methode ergibt eine Exception Allgemeine Java-Themen 13
M Wie kann ich ein int[] Array in einer Methode benutzen? Allgemeine Java-Themen 6
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
F Was ist der Dateityp meines Parameters für die Main Methode. Allgemeine Java-Themen 6
F Variablen Palindromzahl (Probleme mit Methode) Allgemeine Java-Themen 9
B APi methode kurz anhalten Allgemeine Java-Themen 8
P Methode aus anderem Paket aufrufen Allgemeine Java-Themen 1
K ursprüngliche ArrayList ändert sich bei Übergabe in Methode Allgemeine Java-Themen 18
R Rekursive Methode Allgemeine Java-Themen 8
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
R Wo ist mein Fehler in der Methode DRINGEND Allgemeine Java-Themen 9
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
E RMI NULL-Pointer-Exeception wenn der RMI-Proxy eine Methode deligiert Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben