Regex bei ReplaceAll ersetzt Wort und Sonderzeichen nicht.

osion

Bekanntes Mitglied
Hallo

Ich habe folgenden Code (betrifft Zeile 18):

[CODE lang="java" highlight="18"]/**
* Ruft in einem bestimmten Absatz ein Wort oder Textteil auf und ersetzt ihn durch etwas selbst definiertes.
*
* @param search das zu ersetzende Wort
* @param substitute damit wird das Wort ersetzt
* @param paragraphNr definierte Nummer des Paragraphen
* @return Gebe 0 (Alles OK) oder Fehlermeldung zurück.
*/
public int replace(String search, String substitute, int paragraphNr) {
if (paragraphNr < 0) {
return 451;
}
if (text.isValidString(substitute)) {
String oldText = text.getParagraph(paragraphNr);
String newText;

if (substitute.matches(".*[\\s\\!\\?,.:;„\"'\\–]+$")) {
newText = oldText.replaceAll("\\b" + search + "\\b[.!?,;:\"'-()/]+", substitute);
} else {
newText = oldText.replaceAll("\\b" + search + "\\b", substitute);
}
return text.replacePartOfTheParagraphText(paragraphNr, newText);
}

return 450;
}[/CODE]

Original String: Mir geht es gut danke.
Neuer gewollter String: Mir geht gut tschau.
Ersetzt werden soll: danke. -> tschau.
Vorgabe: Ersetzt werden dürfen Wörter (egal bei diesem Problem) und Textteile (Gehe davon aus, dass nur Wörter + Satzzeichen).

Mein Problem ist, dass danke. nicht mit tschau. ersetzt wird. Gibt es eine Möglichkeit Satzzeichen auch in \b zu nehmen oder eine einfachere Variante?
 
Zuletzt bearbeitet:
Mit dem if bin ich erstmal nicht so einverstanden. Du suchst doch in dem oldtext dein searge und willst es mit substitute ersetzen.
Dein if wird nie das machen was Du willst. was soll es in den substitute mit dem matches zu suchen.

Du willst doch erstmal schauen ob in den Paragrafen das gesuchte Wort vorhanden ist.
Und dann wenn ja ersetzen.
 
Mit dem if bin ich erstmal nicht so einverstanden. Du suchst doch in dem oldtext dein searge und willst es mit substitute ersetzen.
Dein if wird nie das machen was Du willst. was soll es in den substitute mit dem matches zu suchen.

Du willst doch erstmal schauen ob in den Paragrafen das gesuchte Wort vorhanden ist.
Und dann wenn ja ersetzen.
Ich suche nach Satzteile, dass Problem ist, wenn jemand ein Satzzeichen schreibt, dann wird kein Leerschlag gemacht und somit bei \b auch nicht ersetzt. Gleichzeitig darf ein Wieder nicht ersetzt werden wenn ich er durch en ersetzen will.

Es könnte auch folgendes Vorkommen:
Original: Ich gehe nach hause. Kommst du mit?
Zu ersetzen: hause. -> in die Kirche.
 
Wenn ich das richtig sehe musst du zwei Fälle unterscheiden:
search endet auf einen Buchstaben, dann muss danach das Wort zu Ende sein, das erreichst du ja mit \b.
Oder aber search endet nicht auf einen Buchstaben (sondern zB den Punkt), dann musst du genau diesen String ersetzen.

Das scheinst du ja auch zu versuchen (mit dem if), die Richtung ist aber etwas falsch. Einmal ist die Bedingung falsch, du prüfst substitute und nicht search. Dann behandelst Du ersten Fall richtig (der else-Block), im anderen Fall baust Du dir aber einen sehr merkwürdigen Regex, das muss man dort mMn gar nicht.

Außerdem kannst du den Such-String nicht direkt im Pattern nutzen, da ja zB der Punkt dabei nicht den Punkt, sondern jedes Zeichen matched. Die Klasse Pattern bietet da aber was passendes für.
 
Java:
if (substitute.matches(".*[\\s\\!\\?,.:;„\"'\\–]+$")) {
            newText = oldText.replaceAll("\\b" + search , substitute);
        } else {
            newText = oldText.replaceAll("\\b" + search + "\\b", substitute);
        }
so sollte dien satz ersetzt werden
 
Java:
if (substitute.matches(".*[\\s\\!\\?,.:;„\"'\\–]+$")) {
            newText = oldText.replaceAll("\\b" + search , substitute);
        } else {
            newText = oldText.replaceAll("\\b" + search + "\\b", substitute);
        }
so sollte dien satz ersetzt werden
Das geht leider nicht. Es ersetzt nicht die Satzzeichen:
Hallo wie geht es dir? -> Hallo wie geht es mir?? (Ersetze: Hallo wie geht es mir?)

Der Grund ist, weill ? das wie ein Kommando interpretiert wird. Kann ich den ganzen String ESCAPEN für Regex und wie?
 

Anhänge

  • 1636478950906.png
    1636478950906.png
    6,7 KB · Aufrufe: 1
Zuletzt bearbeitet:
Java:
    public int replace(String search, String substitute, int paragraphNr) {
        if (paragraphNr < 0) {
            return 451;
        }
        if (text.isValidString(substitute)) {
            substitute = substitute.replace("?", "\\?")
                    .replace("!", "\\!");
            search = search.replace("?", "\\?")
                    .replace("!", "\\!");
            
            String oldText = text.getParagraph(paragraphNr);
            String newText;
            if (substitute.matches(".*[\\s\\!\\?,.:;„\"'\\–]+$")) {
                newText = oldText.replaceAll("\\b" + search, substitute);
            } else {
                newText = oldText.replaceAll("\\b" + search + "\\b", substitute);
            }
            return text.replacePartOfTheParagraphText(paragraphNr, newText);
        }

        return 450;
    }
Die Lösung wäre etwas in dieser Art.
 
Geht doch nicht.....Das Fragezeichen bleibt.
Kennt jemand eine Möglichkeit, dass ich in einem String auch Regex Befehlszeichen escapen kann..und das es klappt?
 

Neue Themen


Zurück
Oben