Benötigen Sie eine Regex, um bestimmte Zeichenfolgen auszuschließen

8

Ich versuche eine passende Regex zu erhalten:

%Vor%

stimmt aber nicht überein:

%Vor%

Ich habe es versucht

%Vor%

ohne Glück (es enthält sogar die "16" Aufnahme)

    
TheSoftwareJedi 24.11.2008, 16:18
quelle

6 Antworten

11

Einige Regex-Bibliotheken erlauben Lookahead:

%Vor%

Ansonsten können Sie immer noch mehrere Zeichenklassen verwenden:

%Vor%

oder, um maximale Portabilität zu erreichen:

%Vor%

[^(16)] bedeutet: Entsprechen Sie einem beliebigen Zeichen, aber geschweiften Klammern, 1 und 6.

    
phihag 24.11.2008, 16:21
quelle
5

Die beste Lösung wurde bereits erwähnt:

%Vor%

Das funktioniert, und es ist gierig genug, alles, was darauf kommt, auf die gleiche Linie zu bringen. Wenn Sie jedoch wissen, dass Sie einen gültigen Dateinamen haben möchten, schlage ich vor, auch ungültige Zeichen zu beschränken:

%Vor%

Wenn Sie mit einer Regex-Engine arbeiten, die Lookahead nicht unterstützt, müssen Sie überlegen, wie Sie das schaffen! Sie können Dateien in zwei Gruppen aufteilen, die mit 1 beginnen und nicht gefolgt von 6, und diejenigen, die mit etwas anderem beginnen:

%Vor%

Wenn Sie somefile_16_stuff.txt, aber nicht somefile_16.txt zulassen wollen, sind diese obigen Ausdrücke nicht ausreichend. Sie müssen Ihr Limit anders festlegen:

%Vor%

Kombinieren Sie all dies und Sie erhalten zwei Möglichkeiten, eine, die die einzelne Instanz blockiert (somefile_16.txt), und eine, die alle Familien blockiert (somefile_16 * .txt). Ich persönlich denke, Sie bevorzugen die erste:

%Vor%

In der Version ohne Sonderzeichen zu entfernen, so ist es einfacher zu lesen:

%Vor%     
Douglas Mayle 24.11.2008 16:36
quelle
4

Um genau zu Ihrer Spezifikation zu gehorchen und wählerisch zu sein, sollten Sie lieber verwenden:

%Vor%

, so dass somefile_1666.txt, das {alles} ist, angepasst werden kann;)

aber manchmal ist es einfach lesbarer zu benutzen ...:

%Vor%     
Piotr Lesnicki 24.11.2008 16:37
quelle
3
%Vor%

(?! 16) bedeutet: Stellen Sie sicher, dass es unmöglich ist, den Regex "16" ab dieser Position abzugleichen.

    
Julien Hoarau 24.11.2008 16:26
quelle
2

Manchmal ist es einfacher, zwei reguläre Ausdrücke zu verwenden. Suchen Sie zuerst nach allem, was Sie wollen, und ignorieren Sie dann alles, was Sie nicht tun. Ich mache dies die ganze Zeit in der Befehlszeile, wo ich eine Regex pipe, die eine Obermenge in eine andere Regex bekommt, die Dinge ignoriert, die ich nicht will.

Wenn das Ziel darin besteht, den Job zu erledigen, anstatt den perfekten Regex zu finden, dann sollten Sie diesen Ansatz in Betracht ziehen. Es ist oft viel einfacher zu schreiben und zu verstehen als eine Regex, die exotische Funktionen nutzt.

    
Bryan Oakley 24.11.2008 16:39
quelle
1

Ohne Lookahead zu verwenden

%Vor%

Lesen Sie es wie folgt: somefile_ gefolgt von entweder:

  1. nichts.
  2. ein Zeichen.
  3. ein beliebiges Zeichen außer 1 und gefolgt von anderen Zeichen.
  4. drei oder mehr Zeichen.
  5. entweder 10 .. 19 Beachten Sie, dass 16 weggelassen wurde.

und schließlich gefolgt von .txt .

    
Pierre 24.11.2008 16:42
quelle

Tags und Links