String Zeichen (was mehrfach vorkommt) suchen & eliminieren

Hallo Community,

ich komm gerade nicht drauf wie ich das Problem lösen soll.

Es geht darum das es ein String vorhanden ist der wie folgt aussehen kann: “en, de, zh-CN, uk, zh, zh-TW, sv”

Nun geht es darum das “zh” aus den String zu löschen, sprich dass das ganze dann so ausschaut: “en, de, zh-CN, uk, zh-TW, sv”

Ich hab gerade keine Ahnung wie ich das am Besten lösen könnte.

Für Anregungen und Tipps wäre ich sehr Dankbar.

Grüße
Mad

"en, de, zh-CN, uk, zh, zh-TW, sv".replaceAll("zh","");

Schau dir in der [JAPI]String[/JAPI]-Klasse mal die replace(...) Methoden an, damit müsste das relativ schnell gehen.

Gruß

Edit: Zu langsam

yup dann bekomm ich folgendes: en, de, -CN, uk, , -TW, sv aber das zh vor CN und TW sollte ja bestehen bleiben.

Damit eliminierst du leider alle zh, nicht nur das alleinstehende.

Kleine Korrektur: "en, de, zh-CN, uk, zh, zh-TW, sv".replaceAll("zh,","");

Nope, wenn dann: "en, de, zh-CN, uk, zh, zh-TW, sv".replaceAll("zh,",""), sonst löscht du zu viel. Aber es geht wohl auch um das auffinden von solchen duplikaten. Da wirst du im worst-case den String durchgehen müssen und schauen, was vorhanden ist und was nicht. Ich hab da noch eine Idee wie man es mittels Regex finden könnte, aber dazu muss ich selber erstmal ein wenig basteln.

auf jeden Fall gute Lösung, nur wenn der String wie folgt lautet: “en, de, zh-CN, uk, zh-TW, sv, zh”

hab ich dann doch wieder ein Problem

Tschuldigung, Tschuldigung! Hatte nicht richtig gelesen…
Aber ich glaube wenn du die Aufgabe von der Schule bekommen hast, dann sollst du es selber machen…

Edit:
Das da wäre?

:smiley: ich hab sie nicht von der Schule bekommen … stehe bei nen privaten Projekt gerade vor den Problem

Also wenn die mit dem Bindestrich und der 2. Kennung erhalten bleiben sollen, wird allerdings weniger trivial. Dann würde ich mit 'nem anderen Regex suchen (Bindestrich ausschliessen). Leider habe ich mich in den letzten Jahren nur noch wenig bis gar nicht mehr mit Regex befasst, sodass ich kaum weis, wie ein entsprechender aussehen müsste.
Wenn’s um Länderkennungen geht, würde ich allerdings auch die weniger spezifizierten drin lassen und eine Standardspezifikation bestimmen.

Jap, erwischt :slight_smile: Es geht um Länderkennungen, das Problem ist das diese mir vorgegeben sind. zh = China, sind auch die einzigen mit Zusätzen.

Dann muss ich mich wohl oder übel mehr mit den Regex Funktionen befassen. Besten Dank schonmal.

[QUOTE=Madlip]auf jeden Fall gute Lösung, nur wenn der String wie folgt lautet: “en, de, zh-CN, uk, zh-TW, sv, zh”

hab ich dann doch wieder ein Problem[/QUOTE]

Da hast du recht, sorry. Kurzer Ansatz:

        String[] elements = toFilter.split(",");
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < elements.length; i++) {
            if (!elements**.trim().equals(filter)) {
                if (i > 0) {
                    builder.append(",");
                }
                builder.append(elements**);
            }
        }
        return builder.toString();
    }```

Noch nicht perfekt, scheint aber zu funktionieren:


Matcher matcher = Pattern.compile("([a-z]{2})(?<!\\\\-)").matcher(search);

while(matcher.find()) {
    String found = matcher.group(1);

    if(search.indexOf(found + "-") != -1) {
        search = search.replaceAll("\\s?" +found + "(?!-),?", "");
    }
}

System.out.println(search);```

Ausgabe: `en, de, zh-CN, uk, zh-TW, sv-TE,`

Der oben stehende Code findet jetzt z.B. selbstständig das unnötig vorkommende `zh` und schmeißt es raus. Dazu wählt es zuerst alle Elemente aus, die kein folgendes `-` besitzen (also im Beispiel oben: de, en, zh, sv, uk). Danach prüft er ob eine spezifikation davon vorkommt (`if(search.indexOf(found+"-") != -1) {`. Trifft das zu, so ersetzt er den entsprechenden Eintrag und versucht dabei noch die String-formatierung ein wenig beizubehalten (also unnötiges leerzeichen und Komma entfernen, sofern vorhanden)

Perfekt, das funktioniert wunderbar. Ich Danke euch!

[QUOTE=Madlip]zh = China, sind auch die einzigen mit Zusätzen.[/QUOTE]In deinem Beispiel vllt. Sonst han nämlich jede Länderkennung einen Zusatz, welche am Beispiel England ungefähr so “en-EN” oder Deutschland so “de-DE” aussieht.

edit: Naja… egal… wenn wir keine Tomaten hätten, würden wir verhungern. :lol:

ja da hast du Recht da gibt es auch noch “en-UK”, “en-US”, “de-ZH”, “de-DE”, “de-AT”

Aber da muss ich mal schauen in wie weit ich das Berücksichtigen werde, weil in meinen speziellen Fall macht das denke ich nicht so viel sinn.

System.out.println("en, de, zh-CN, uk, zh-TW, sv, zh".replaceAll(",? zh(?!-)", ""));```

*** Edit ***

Stichwort "negative look-ahead assertion", ersetze "zh", wenn kein "-" folgt: "zh(?!-)"

Genial! Aber das ist jetzt ne Nummer zu hoch für mich, da muss ich noch einiges Nachholen, danke Michael

[QUOTE=_Michael;68563]System.out.println("en, de, zh-CN, uk, zh, zh-TW, sv".replaceAll(",? zh(?!-)", "")); System.out.println("en, de, zh-CN, uk, zh-TW, sv, zh".replaceAll(",? zh(?!-)", ""));

*** Edit ***

Stichwort “negative look-ahead assertion”, ersetze “zh”, wenn kein “-” folgt: “zh(?!-)”[/QUOTE]

Fast perfekt. Der RegExp funktioniert aber nicht wenn zh ganz am Anfang steht weil das Leerzeichen am Anfang immer vorhanden sein müßte.

System.out.println("en, de, zh-CN, uk, zh-TW, sv, zh".replaceAll("(, )?zh(?!-)", ""));```

Willst du denn ein einfaches zh auch dann entfernen, wenn keine weiteren Spezialisierungen wie zh-TW vorkommen?