2016-05-02 16 views
0

Ftp-Server hat folgende Dateien erstellt auf täglich Basis.Regex zur Auswahl nur Pattern-Match-Dateien

  • FGI_WTYUIO_D_2016_04_16_BS.daily.gzip - BS Datei
  • FGI_WTYUIO_D_2016_04_16_BV.daily.gzip - BV Datei
  • FGI_GHJK_D_2016_04_16_SATB3.daily.gzip - B3 Datei
  • FKI_GHJK_D_2016_04_16_SAT.daily.gzip - BV Datei
  • FKI_GHJK_D_2016_04_16_SATB3.daily.gzip - B3 Datei
  • FKI_GHJK_D_2016_04_16_SATBS.daily.gzip - BS Datei
  • FKI_GHJK_D_2016_04_ 16_SSD.daily.gzip - Notwendigkeit zu ignorieren
  • FKI_GHJK_D_2016_04_16_SSDBS.daily.gzip - Notwendigkeit zu ignorieren

Also, im Grunde gibt es zwei Dateitypen

  • FGI
  • FKI

und Drei Report-Code für jedes Filetypes

  • BS
  • BV
  • B3

Ich brauche Rest der Dateien zu ignorieren. (SSD-Dateien).

Ich muss Regex-Muster in Javascript schreiben, um diese Dateien zu holen. welches folgende Variablen hat.

  • Dateidatum - Datum ex. 2016_04_16
  • matchReportCode - ex. BV, BS, B3

Also, wenn Dateidatum = 2016_04_15 und matchReportCode = 'SV' (BS, BV). Dann sollte ich nur folgende Dateien holen.

  • FGI_WTYUIO_D_2016_04_15_BS.daily.gzip - FGI BS Datei
  • FGI_WTYUIO_D_2016_04_15_BV.daily.gzip - FGI BV Datei
  • FKI_GHJK_D_2016_04_16_SAT.daily.gzip - FKI BV Datei
  • FKI_GHJK_D_2016_04_16_SATBS.daily.gzip - FKI BS Die Datei

Also, wenn Dateidatum = 2016_04_19 und matchReportCode = '3S' (B3, B S). Dann sollte ich nur folgende Dateien holen.

  • FGI_WTYUIO_D_2016_04_15_BS.daily.gzip - FGI BS Datei
  • FGI_GHJK_D_2016_04_16_SATB3.daily.gzip - FGI B3 Datei
  • FKI_GHJK_D_2016_04_16_SATB3.daily.gzip - FKI B3 Datei
  • FKI_GHJK_D_2016_04_16_SATBS.daily.gzip - FKI BS Datei

I Bisher konnte nur auf das kommen.

FileRegex = "F[KG]I_.*_D_" + fileDate + "_[A-z]{0,3}L{0,1}[" + matchReportCode + "]{0,1}.daily.gzip"; 

Kann mir bitte jemand helfen? Ich bin neu in Regex. Vielen Dank.

+0

Correct Regex: FileRegex = "F [KG] I _ * _ D_" + + Dateidatum „_ [Az] {0,3} B {0,1} ["+ matchReportCode +"] {0,1} .daily.gzip "; – jigarshah

+0

['[A-z]' passt mehr als Sie denken] (http://stackoverflow.com/questions/29771901/why-is-this-regex-allowing-a-caret/29771926#29771926). –

Antwort

0

Folgendes kann etwas besser sein:

FileRegex = "F[KG]I_[^_]+_D_" + fileDate + "_(?!SSD)[a-zA-Z]{0,3}((B[" + matchReportCode + "])|(?<^FKI.*)).daily.gzip"; 

FKI und FGI Dateinamen Dies wird übereinstimmen, dass die gewählte reportCode die gewählte Dateidatum und bis zu drei Buchstaben haben vorhergehenden.

Die anderen Änderungen umfassen ändernden [A-z], zu [a-zA-Z], ist dies, weil regex Zeichenklasse Bereichsausdruck die ASCII-Darstellungen verwendet, und es gibt Zeichen ([- usw.) zwischen A und Z, die nicht alphabetisch sind (was zu sein scheint deine Absicht).

Auch .*_ wurden [^_]+_ erfordert dies, dass es zumindest ein Zeichen neben dem Unterstrich sein, verhindert, dass der Motor nicht mit so viel, wie auch was der regex einfacher zu bearbeiten, wenn ein anderes Segment hinzugefügt wird zurückzuverfolgen.

Ich habe auch einen negativen Lookahead (?!SSD) am Anfang des letzten Segments hinzugefügt, was erfordert, dass das Segment nicht mit SSD starten.

Die oder Bedingung am Ende ((B[" + matchReportCode + "])|(?<^FKI.*)) erfordert, dass entweder die Datei den Berichtscode übereinstimmen, oder dass der Dateiname mit FKI beginnt (gefolgt von einer beliebigen Anzahl von Zeichen, um wieder zum Ende zu gelangen). ^ ist der Start des Linienankers, wenn er außerhalb einer Zeichenklasse verwendet wird ([...]).

+0

Wie ignoriert man SSD-Dateien? Regex wird das auch kopieren, oder? Außerdem habe ich keinen BV-Code im FKI-Typ - FKI_GHJK_D_2016_04_16_SAT.daily.gzip - – jigarshah

+0

Siehe meine aktualisierte Antwort. Ich war mir nicht sicher, ob der fehlende Report-Code ein Tippfehler war, und ich kann andere Beiträge nicht kommentieren, um sie zu klären, weil ich im Moment nur 10 Wiederholungen habe. – James

0

Sie können mit negativen lookahead:

var fileDate = '2016_04_19'; 
var matchReportCode = 'BS'; 
var re = new RegExp('F[KG]I_\\w+_D_' + fileDate + 
    '_(?!SSD)[\\w\\d]*' + matchReportCode + '?\\.daily\\.gzip'); 

// re.test('FKI_GHJK_D_2016_04_19_SSDBS.daily.gzip') === false 
// re.test('FKI_GHJK_D_2016_04_19_SATBS.daily.gzip') === true