Replace Alogorithmus funktioniert nicht immer!
Abuze
- java
0 Beate Mielke0 Abuze
Hallo liebe Gemeinde,
ich hab das folgende Java-Programm,
das Zeichenketten durch andere Zeichenketten
in einem String ersetzt. Befindet sich jedoch die
zu ersetzende Zeichenkette in einem Html-Tag, so
soll sie NICHT ersetzt werden.
z.B: x durch [s] ersetzen:
x<xh1x>hallox<x/h1x>xneux --> [s]<xh1x>hallo[s]<x/h1x>[s]neu[s]
Mein Algorithmus funktioniert, aber nicht für Beispiel wie oben,
weil beim ersetzen von 'xneux', das Programm abstürzt.
Wießt ihr wie das Problem beheben kann?
Hier mein Test-Programm:
import java.awt.event.*;
import java.awt.*;
import java.util.*;
import javax.swing.text.*;
public class Test {
public boolean isInTag(String mytext, int value) {
int i = 0;
boolean aufhoeren = false;
boolean result = false;
JTextPane editorField = new JTextPane();
editorField.setText(mytext);
String substr = editorField.getText().substring(value+i,value+i+1);
if (((mytext.indexOf("<")) != -1) ((mytext.indexOf(">")) != -1))
if ((substr.equals("<")) (substr.equals(">")))
result = true;
else
while (aufhoeren != true) {
substr = editorField.getText().substring(value+i,value+i+1);
if (substr.equals(">"))
{ aufhoeren = true;
result = true;
}
if (substr.equals("<"))
{ aufhoeren = true;
result = false;
}
i++;
if ((value+i) > editorField.getText().length()) {
aufhoeren = true;
result = false;
}
}
else result = false;
return result;
}
public String replaceText(String alt, String neu, String inhalt) {
int pos = 0;
pos = inhalt.indexOf(alt, pos);
while (pos != -1) {
if (!(isInTag(inhalt, pos))) {
inhalt = inhalt.substring(0,pos) + neu + inhalt.substring(pos+alt.length());
pos = inhalt.indexOf(alt, pos+neu.length());
}
else
pos = inhalt.indexOf(alt, pos+alt.length());
// System.out.println(inhalt.substring(pos));
}
return inhalt;
}
public static void main(String[] args) {
Test v = new Test();
String mystring = "xxx<h1x>brxuder</hx1>xhallo";
System.out.println(mystring);
System.out.println(v.replaceText("x","[s]",mystring));
// for (int n = 0; n < mystring.length(); n++) {
// System.out.println(v.isInTag(mystring, n));
// }
System.exit(0);
}
}
Hallo Abuze,
in Deiner Methode isInTag() hast u in einer Schleife die folgende Zeile:
a) substr = editorField.getText().substring(value+i,value+i+1);
und weiter unten prüfst Du die Abbruchbedingung folgendermaßen ab:
b) if ((value+i) > editorField.getText().length())
Dadurch überschreitest Du in Zeile a) die String-Grenze um ein Zeichen. Deshalb mußt Du in Zeile b)
(value + i) durch (value + i +1) ersetzen, dann funktioniert's.
Im übrigen ist mir aufgefallen, daß Du javax.swing.* für JTextPane nicht importiert hast, das müßte meines Erachtens eigentlich sowieso noch zu einem Compilerfehler führen.
Bei mir war's jedenfalls so ;-)
Gruß
Beate Mielke
Hallo Beate,
danke sehr. Dein Tipp war goldwert.
Ich habe genau dieses total übersehen!
Bis Bald!
Gruß Abuze