Dateinamen mit Regex finden


TischlerVS

Grünschnabel
Hallo,

ich möchte alle Dateien in einem Ordner, die einem bestimmten Muster entsprechen, in ein Array einlesen.

Suchmuster:
- Datei beginnt mit mindestens einem beliebigen Zeichen
- Vor dem Dateikürzel darf kein "_id1234" stehen ( Zahl 1 bis unendlich)
- erlaubte Dateikürzel sind ".txt" oder ".csv"

Ich möchte dies gerne mit einem Regex lösen.

Bedingung trifft zu auf:
FilenameABC.txt
FilenameXYZ.csv

Bedingung trifft nicht zu auf:
FilenameABC_id1234.txt
FilenameABC_id12.csv

Die umgekehrte Suche, also für alle Dateien mit "_id1234", habe ich schon mit folgendem Suchmuster hinbekommen:
.+(_id[1-9]\d{0,})\.(txt|csv)$

Wie muss das Suchmuster für Regex lauten, damit alle Dateien ohne "_id1234" im Namen gefunden werden?

Mein Code sieht bisher so aus:
Visual Basic:
Dim pattern As String = ".+(_id[1-9]\d{0,})\.(txt|csv)$"
Dim files As IEnumerable(Of String) = Directory.GetFiles(path).Where(Function(f) Regex.IsMatch(f, pattern, RegexOptions.IgnoreCase))
 
Zuletzt bearbeitet:

Spyke

Premium-User
OK bin grad irgendwie zu blöd en Regex dafür zusammen zu basteln ^^
Aber du hast ja den pattern für den Positionen fall

prüf doch einfach mittels

reges.isMatch == false

wenn dein Pattern mit der positiven Id suche false liefert müsste es ja auch das sein was de erreichen willst
 

TischlerVS

Grünschnabel
OK bin grad irgendwie zu blöd en Regex dafür zusammen zu basteln ^^
Aber du hast ja den pattern für den Positionen fall

prüf doch einfach mittels

reges.isMatch == false

wenn dein Pattern mit der positiven Id suche false liefert müsste es ja auch das sein was de erreichen willst
Hallo Spyke,

danke erst einmal für deine Antwort.

Wenn ich so vorgehe, dann würden aber alle anderen Dateien zurückgegeben und nicht nur die txt und csv Dateien. Dann könnte ich natürlich noch einmal filtern, aber lässt sich das nicht mit einem Regex komplett erledigen?

Der Regex ist ja eine Mischung aus das soll ( \.(txt|csv)$ ) und das soll nicht ( _id[1-9]\d{0,} ).
Mit ?! kann man ja einen Teilausdruck negieren.

Wenn ich aber .+(?!_id[1-9]\d{0,})\.(txt|csv)$ verwende, dann werden alle txt und csv Dateien gefunden, weil sich das .+ alle Zeichen vor dem Dateikürzel krallt.

Kann ich .+ irgendwie begrenzen?
 

Yaslaw

n/a
Moderator
Nachtrag:
Es geht auch mit Positiven Strings (also nicht verdreht):
Regex101 - online regex editor and debugger
Code:
^\b((?!id[1-9]\d*).)*\.(txt|csv)$

Nachtrag zum Nachtrag:
Die Andere Version ist doch besser. Denn hier ist es nicht gegeben, dass die ID direkt vor dem Punkt stehen muss

Noch ein Nachtrag:
Es geht doch, ist aber komplizierter zum verstehen
Code:
^((?!id[1-9]\d*(?=\.(?:txt|csv)$)).)*\.(txt|csv)$
 
Zuletzt bearbeitet:

TischlerVS

Grünschnabel
Respekt Yaslaw!
Du kennst dich aber mal wirklich damit aus.

Funktionieren tut dein letztes Suchmuster schon einmal. Mit dem Verstehen habe ich allerdings im Moment noch so meine Probleme. Versuche ich später mal noch nachzuvollziehen.

Vielen Dank für die Hilfe! :)
 

Yaslaw

n/a
Moderator
((?!abc).)+ Nimm mindestens ein Zeichen, vor dem nicht abc steht.
Die Kunst ist es, das abc zu defineieren. In dem Fall ist es id&Nummer&Punkt&Endung&Textende. ((?!id[1-9]\d*(?=\.(?:txt|csv)$)).)*.

Darauf folgt dann eben ein Punkt und die Endung. Das gfanez mit Anfang und Ende Text eingefasst.
 

Neue Beiträge