Entfernen Sie alle Nicht-Wort-Zeichen außer if & amp; oder & ap; Muster

9

Ich versuche eine Zeichenkette aller Nicht-Wort-Zeichen zu bereinigen, außer wenn es & amp; d. h. Muster könnte wie &[\w]+;

sein

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?

    
Watt 14.02.2013, 18:16
quelle

3 Antworten

2

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:

  • Das erste replaceAll ersetzt das Muster wie & mit &ampXXX oder jede andere Sequenz, die für die letzte ; ersetzt wurde.
  • Der zweite replaceAll ersetzt alle & 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.
  • Das dritte replaceAll ersetzt XXX durch ; , um & von &ampXXX 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.

%Vor%

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.

    
Rohit Jain 14.02.2013, 18:46
quelle
2

Ich bin mir nicht sicher, ob Sie dies mit einem einfachen String.replaceAll tun können. Sie sollten wahrscheinlich ein Muster und Matcher , um die Matches zu durchlaufen, effektiv eine manuelle Suche durchzuführen und zu ersetzen. Etwas wie der folgende Code sollte den Trick tun.

%Vor%     
Eric Galluzzo 14.02.2013 18:38
quelle
0

Ich würde vorschlagen, dass Sie ein negatives Lookahead wie folgt verwenden:

%Vor%

Was ersetzt alle & amp; nicht gefolgt von einem Wort, das mit einem Semikolon endet.

BEARBEITEN (Java):

%Vor%     
migg 14.02.2013 18:24
quelle

Tags und Links