Abuze: Replace Alogorithmus funktioniert nicht immer!

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);
   }
}

  1. 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

    1. Hallo Beate,

      danke sehr. Dein Tipp war goldwert.
      Ich habe genau dieses total übersehen!

      Bis Bald!
      Gruß Abuze