Mit diesem Code versuche ich, das genaue Wort axe
durch sword
zu ersetzen. Wenn ich dies jedoch ausführe, druckt es sword picksword
, während ich nur sword pickaxe
drucken möchte, da pickaxe
ein anderes Wort von axe
ist, obwohl es es enthält. Wie kann ich das beheben? Danke
Verwenden Sie einen Regex mit Wortgrenzen \b
:
Der umgekehrte Schrägstrich vom Begrenzungssymbol muss mit Escapezeichen versehen werden, daher Doppel-Backslashes.
Fügen Sie die Wortgrenze vor und nach dem Wort ein, das Sie ersetzen möchten.
%Vor%Bearbeiten Ausgabe
%Vor% Einige andere Antworten schlagen Ihnen vor, \b
Wortgrenzen zu verwenden, um ein exaktes Wort zu finden. Aber \bfoo\b
würde der Teilzeichenfolge foo
in .foo.
entsprechen. Wenn Sie diese Art von Verhalten nicht möchten, dann sollten Sie Lookaround-basierte Regex verwenden.
Erläuterung:
(?<!\S)
Negativer Lookbehind, der vorgibt, dass der Übereinstimmung kein Leerzeichen vorangestellt wird. h. der Übereinstimmung muss der Anfang der Liniengrenze oder ein Leerzeichen vorausgehen.
(?!\S)
Negatives Lookahead, das bestätigt, dass auf die Übereinstimmung kein Leerzeichen folgt, d. h. auf die Übereinstimmung muss das Ende der Liniengrenze oder des Zeilenabstands folgen. Wir können (?<=^|\s)axe(?=\s|$)
nicht verwenden, da Java Look-Behind-Assertionen mit variabler Länge nicht unterstützt.
Sie müssen replaceAll anstelle von replace verwenden - weil es mit regulären Ausdrücken arbeiten kann. Verwenden Sie dann das Meta-Zeichen \ b, das für die Wortgrenze steht. Um es zu benutzen, musst du das \ as double \ entschlüsseln, damit die reges zu \baxe\b
Sie können \b
verwenden, um die Wortgrenze zu definieren, also in diesem Fall \baxe\b
.
Wenn Sie nur das erste Vorkommen ersetzen möchten, gibt es eine Methode replaceFirst
in String
object.