wie man jeden regulären Ausdruck in Java negiert

7

Ich habe einen regulären Ausdruck, den ich negieren möchte, z. B.

%Vor%

welche String.matches das folgende

zurückgibt %Vor%

Gibt es eine Möglichkeit, das obige zu negieren (nur mit regx), so dass die Ergebnisse lauten:

%Vor%

Ich suche nach einer allgemeinen Lösung, die für jeden regx funktioniert, ohne den gesamten Regex neu zu schreiben.

Ich habe mir folgendes angeschaut Wie negiere ich die ganze Regex? mit (?! Muster), aber das scheint nicht für mich zu arbeiten.

Das folgende regx

%Vor%

gibt Folgendes zurück:

%Vor%

was ich nicht will. Jede Hilfe wäre willkommen.

    
Wayne 22.12.2011, 23:12
quelle

1 Antwort

23

Sie müssen Anker hinzufügen. Die ursprüngliche Regex (abzüglich der unnötigen Klammern):

%Vor%

... entspricht einer Zeichenfolge, die enthält , gefolgt von null bis vier weiteren Zeichen. Da Sie die Methode matches() verwenden, wird sie automatisch verankert, als wäre sie wirklich:

%Vor%

Um das Umgekehrte zu erreichen, können Sie sich nicht auf die automatische Verankerung verlassen; Sie müssen mindestens den Endanker im Lookahead explizit machen. Außerdem müssen Sie die Regex mit einem .* "auffüllen", da matches() erfordert, dass die Regex die gesamte Zeichenfolge konsumiert:

%Vor%

Aber ich empfehle, dass Sie den gesamten Regex explizit verankern, so:

%Vor%

Es schadet nicht, und es macht Ihre Absicht vollkommen klar, besonders für Leute, die Regexes aus anderen Geschmacksrichtungen wie Perl oder JavaScript gelernt haben. Die automatische Verankerung der Methode matches() ist sehr ungewöhnlich.

    
Alan Moore 23.12.2011, 00:09
quelle

Tags und Links