Zeichenkette markieren

Jats

Aktives Mitglied
Tag, ich hab ein kleines Problem, mit der Methode substring.
Ich soll eine bestimmte Zeichenkette aus meinem Suchfeld im String suchen und diese im Ausgabestring markieren.

Allerdings läuft bei mir die Ausgabe schief, da ich via indexOf den Anfangspunkt des gesuchten String hole, einen substring von der Eingabe erstelle und danach, damit wietergesucht wird, ob das Zeichen/die Zeichenkette erneut vorkommt, setze ich die Variable für den Index um.
Ich gehe mal davon aus, dass man das mit einer Schleife machen sollte, aber ich bekomms echt nicht hin :/

Hoffe, mir kann jemand einen kleinen Tipp geben.
Mir ist schon klar, dass die Ausgabe so, wie sie da steht nicht funktionieren kann.

Hier der Code für den Eintrag in actionPerformed:
Java:
        if (o==bSuche) {

            String suche = tSuche.getText();
            int index = textEingabe.indexOf(suche);

            while (index<textEingabe.length()-suche.length()) {

                if ( index != -1) {
                    String eingabeSub = "***"+textEingabe.substring(index,index+suche.length())+"***";
                    index = textEingabe.indexOf(suche,index+suche.length());
                    textAusgabe = textEingabe.substring(0,index)+eingabeSub+textEingabe.substring(index+suche.length());
                }
                else {

                }

            }

        }

Danke schonmal .
 

jwiesmann

Bekanntes Mitglied
Also dein While sieht irgendwie komisch aus... probiers mal (ungefähr) so

Java:
        int go = textEingabe.indexOf(suche);
        while (go > -1) {
           // mach was...
           go = textEingabe.indexOf(suche, go + 1);
        }
 
B

bygones

Gast
mal nur die Schleife... vll hilfts dir weiter
Java:
public static void main(String[] args) {
        String foo = "foo bar mal foo ist aber foo auch";
        String toFind = "foo";
        int start = 0;

        while ((start = foo.indexOf(toFind, start)) != -1) {
            System.out.println("and found it at ");
            start++;
        }
        System.out.println("end");
    }
 

Jats

Aktives Mitglied
Also dein While sieht irgendwie komisch aus... probiers mal (ungefähr) so

K, danke :)
Aber die Ausgabe ist dann doch immernoch falsch, oder nicht ?
Weil der Text dann immer erst gesetzt wird, wenn index auf die letzte Stelle des Fundes vom zu suchenden String gesetzt wurde.

Gut, ich werde beides versuchen und mich dann nochmal melden.
Muss jetzt aber erstmal weg .

EDIT:

So, ich hab jetzt mal versucht, die Schleife zu verändern, da index ja schon vorher deklariert wird, hab ich einfach "index != -1" in die while geschrieben.
Müsste ja dann vom Sinn her dasselbe sein, aber funktionieren wills immernoch nicht.
Klar, wenn man das mit System.out.println macht, wird der Text jedes Mal erneut ausgegeben, aber wenn ich das mit Substrings machen will, und index, also den Anfang des zu erstellenden Substrings, neu setze, kann das doch so nicht funktionieren, oder ? ???:L

Muss ich dann nicht ein Substring vom Substring machen ?
Das macht mich ein bisschen konfus ^^

Java:
        if (o==bSuche) {

            String suche = tSuche.getText();
            int index = textEingabe.indexOf(suche);
            //String eingabeSub = "";

            while (index != -1) {
                String eingabeSub = "***"+textEingabe.substring(index,index+suche.length())+"***";
                //index = textEingabe.indexOf(suche,index+suche.length());
                index++;
                textAusgabe = textEingabe.substring(0,index)+eingabeSub+textEingabe.substring(index+suche.length());
            }
            //textAusgabe = textEingabe.substring(0,index)+eingabeSub+textEingabe.substring(index+suche.length());
        }
 
Zuletzt bearbeitet:

Paeddah

Mitglied
Hi!

Du könntest es auch alternativ mit einem regulären Ausdruck versuchen, ähnlich zu diesem:
Java:
    String suche = "AB";
    String regExp = String.format("([^(?>%1$s).]*)(%1$s)([^(?>%1$s).]*)", suche);

    System.out.println(regExp);

    String textEingabe = "ABDF Ki ,sd sadfsdf AB sdfsdkgfljlkdgj B ASfsdgfl A";
    System.out.println(textEingabe.replaceAll(regExp, "$1***$2***$3"));

Grüße

Päddah
 

Jats

Aktives Mitglied
Hi!
Du könntest es auch alternativ mit einem regulären Ausdruck versuchen, ähnlich zu diesem:

Danke für den Tipp, aber ich würde das ganz gerne mit Textfeldern machen.
Mein Code sieht mittlerweile so aus, allerdings stimmt die Ausgabe immernoch nicht.
Ich bekomme, je nachdem, was ich verändere entweder "out of range" oder die falschen Zeichen werden markiert.

Eigentlich fehlt doch nicht mehr viel, oder ?

Java:
        if (o==bSuche) {

            String suche = tSuche.getText();
            int stopIndex = textEingabe.indexOf(suche);
            int startIndex = 0;
            String eingabeSub = "";

            while (stopIndex != -1 && (startIndex<textEingabe.length()-suche.length())) {
                eingabeSub += "***"+textEingabe.substring(startIndex,stopIndex+suche.length()-1)+"***";
                //index = textEingabe.indexOf(suche,index+suche.length());
                startIndex = stopIndex+suche.length()+1;
                stopIndex = textEingabe.indexOf(suche,startIndex);                
            }
            textAusgabe = eingabeSub+textEingabe.substring(startIndex,textEingabe.length()-1);
        }

Hoffe auf eine kleine Hilfestellung :)
 

jwiesmann

Bekanntes Mitglied
Danke für den Tipp, aber ich würde das ganz gerne mit Textfeldern machen.
Mir scheint du bist ein wenig lernresistent :) Ohne dir zu nahe treten zu wollen.
Aber was gefällt dir an Paeddah's Lösung nicht? Eleganter geht es kaum noch...


Java:
String suche = tSuche.getText();
String regExp = String.format("([^(?>%1$s).]*)(%1$s)([^(?>%1$s).]*)", suche);
textAusgabe=textEingabe.replaceAll(regExp, "$1***$2***$3");

warum willst du es unbedingt mit einer Schleife programmieren?
Bei deiner Schleife ist der Ansatz irgendwie murgs..

Java:
 String textEingabe = "ichbineinabctext..mitnochabcmehrsonabczeugsabc";
        String textAusgabe = "";
        String suche = "abc";
        int foundAt = textEingabe.indexOf(suche);
        int searchLen=suche.length();
        int startIndex=0;
        StringBuilder builder=new StringBuilder();
        while (foundAt > -1) {
            String leftText = textEingabe.substring(startIndex,foundAt);
            startIndex=searchLen+foundAt;
            builder.append(leftText).append("***").append(suche).append("***");
            foundAt = textEingabe.indexOf(suche, foundAt+1);
        }        
        builder.append(textEingabe.substring(startIndex));
        textAusgabe = builder.toString();

Es kommt zwar dasselbe dabei raus, aber Paeddah Lösung ist wesentlich kürzer und schöner zu lesen... Also erkläre nochmal was genau du machen willst .. oder schweige für immer :D
 

Jats

Aktives Mitglied
Mir scheint du bist ein wenig lernresistent :) Ohne dir zu nahe treten zu wollen.
Aber was gefällt dir an Paeddah's Lösung nicht? Eleganter geht es kaum noch...

Der Lehrer will das so ^^
Und die Schleife hab ich auch mit dem zusammen gemacht.
Laut ihm sind die +1 und -1 noch verkehrt, da müsste ich nur die richtige Stelle finden.
Ich bin zwar anderer Meinung, aber ich komm ja selbst auch nicht weiter.
 

Ähnliche Java Themen

Neue Themen


Oben