Ich versuche eine Zeichenkette aller Nicht-Wort-Zeichen zu bereinigen, außer wenn es & amp; d. h. Muster könnte wie &[\w]+;
Zum Beispiel:
%Vor% Wenn ich string.replaceAll("\W","")
verwende, entfernt es ;
und '&'
auch vom zweiten Beispiel, das ich nicht will.
Kann die Verwendung von negativem Look-Ahead in diesem Problem ein schnelles Regex-Muster ergeben?
Zunächst mag ich die Frage wirklich. Nun, was Sie wollen, könnte nicht mit einem einzigen replaceAll
gemacht werden, weil wir dafür ein negative look-behind
mit variabler Länge benötigen, was nicht erlaubt ist. Wenn es erlaubt wäre, wäre es nicht so schwer gewesen.
Wie auch immer, da single replaceAll
hier keine Option ist, können Sie hier einen kleinen Hack verwenden. Wie zum Beispiel das Ersetzen der letzten semi-colon
von dir entity reference
, mit einer gewissen Zeichenfolge, die du sicher nicht im Rest der Zeichenfolge findest, wie XXX
oder irgendetwas. Ich weiß, das ist nicht korrekt, aber du kannst dir nicht helfen.
Also, hier ist, was Sie versuchen können:
%Vor%Erläuterung:
&
mit &XXX
oder jede andere Sequenz, die für die letzte ;
ersetzt wurde. &
nicht gefolgt von \w+XXX
oder einem beliebigen non-word, non &
-Zeichen. Dies wird alle &'s
ersetzen, die nicht Teil von &
Art von Muster sind. Plus, ersetzt auch jedes andere Nicht-Wort-Zeichen. XXX
durch ;
, um &
von &XXX
zu erstellen
Um das Verständnis zu erleichtern, können Sie stattdessen die Klassen Pattern
und Matcher
verwenden und ich würde es immer vorziehen, sie immer dann zu verwenden, wenn das Ersetzungskriterium komplex ist.
Dies ist ähnlich wie @ Erics Code, aber es ist eine Verallgemeinerung darüber. Das wird natürlich nur für &
funktionieren, wenn es verbessert wurde, um NullPointerException
zu entfernen, das darin geworfen wird.