Frage

Ich habe eine Regex Ich brauche wie so gegen einen Pfad zum Spiel: „C:\Documents and Settings\User\My Documents\ScanSnap\382893.pd~“. Ich brauche einen regulären Ausdruck, der alle Pfade mit Ausnahme derjenigen, endend in Streichhölzer ‚~‘ oder ‚.dat‘. Das Problem, das ich habe ist, dass ich nicht verstehe, wie die exakte Zeichenfolge ‚.dat‘ und am Ende des Weges nur anzupassen und zu negieren. das heißt ich will nicht {d,a,t} an anderer Stelle auf dem Weg entsprechen.

Ich habe die Regex gebaut, aber müssen nicht übereinstimmen .dat

[\w\s:\.\\]*[^~]$[^\.dat]

[\w\s:\.\\]* Dies entspricht alle Worte, Leerzeichen, den Doppelpunkt, Punkte und Rückschritte. [^~]$[^\.dat]$ Dies bewirkt, dass Streichhölzer enden in ‚~‘ zum Scheitern verurteilt. Es scheint, dass ich sollte mit einem negierten Spiel verfolgen können ‚.dat‘, aber das Spiel nicht in meinem Regex-Tester.

ich glaube, meine Antwort liegt in Gruppierung aus beurteilen, was ich gelesen habe, würde mir jemand Punkt in die richtige Richtung? Ich sollte hinzufügen, ich eine Datei bin mit Programm sehen, die Regex Matching erlaubt, ich habe nur eine Linie, die die Regex angeben.

Dieser Eintrag scheint ähnlich: Regex auf mehrere Strings

entsprechen
War es hilfreich?

Lösung

Sie verwenden mögen ein negativ Vorgriff :

^((?!\.dat$)[\w\s:\.\\])*$

Durch die Art und Weise, Ihre Zeichengruppe ([\w\s:\.\\]) erlaubt es nicht, eine Tilde (~) darin. Haben Sie die Absicht, eine Tilde in den Dateinamen zu ermöglichen, wenn es nicht am Ende ist? Wenn ja:

^((?!~$|\.dat$)[\w\s:\.\\~])*$

Andere Tipps

Die folgende Regex:

^.*(?<!\.dat|~)$

entspricht eine beliebige Zeichenkette, die mit nicht zu Ende, ein ‚~‘ oder mit ‚.dat‘.

^             # the start of the string
.*            # gobble up the entire string (without line terminators!)
(?<!\.dat|~)  # looking back, there should not be '.dat' or '~'
$             # the end of the string

Im Klartext: eine Zeichenfolge übereinstimmen nur, wenn hinter vom Ende des Strings suchen, gibt es keine Unter string '.dat' oder '~'

.

Edit: der Grund, warum Ihr Versuch gescheitert ist, weil eine negierte Zeichenklasse [^ ...] wird nur ein einzelnes Zeichen negieren. Eine Zeichenklasse passt immer ein einzelnes Zeichen. Also, wenn Sie tun [^ .dat], du bist negiert nicht die Zeichenfolge „.dat“ aber du bist ein einzelnes Zeichen andere als passend ‚‘, ‚d‘, ‚a‘ oder ‚t‘.

^((?!\.dat$)[\w\s:\.\\])*$

Dies ist nur ein Kommentar zu einem früheren Antwort Vorschlag:

. innerhalb einer Zeichenklasse, [], ist eine wörtliche. und braucht nicht entweichen kann.

^((?!\.dat$)[\w\s:.\\])*$

Es tut mir leid dies als eine neue Lösung zu schreiben, aber ich habe anscheinend nicht genug Glaubwürdigkeit, um einfach Kommentar zu einer Antwort noch.

Ich glaube, Sie für diese suchen:

[\w\s:\.\\]*([^~]|[^\.dat])$

die Funde, wie vor, alle Wort Zeichen, weißer Raum, Punkte (.), Zurück Schrägstriche. Dann paßt für beide Tilde (~) oder ‚.dat‘ am Ende des Strings. Sie können auch ein Caret (^) am Anfang hinzufügen, wenn Sie wissen, dass die Zeichenfolge am Anfang einer neuen Zeile sein sollten.

^[\w\s:\.\\]*([^~]|[^\.dat])$
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top