2010-12-16 2 views
3

Die vorliegende Dokumentation http://h71000.www7.hp.com/doc/731final/documentation/pdf/ovms_731_file_app.pdf (Abschnitt 5-1) sagt der Dateiname sollte wie folgt aussehen:Wie lautet das richtige Regexp-Muster, um mit einem VMS-Dateinamen übereinzustimmen?

node::device:[root.][directory-name]filename.type;version 

Die meisten von ihnen sind optional (wie Knoten, Gerät, Version) - nicht sicher, welche und wie man richtig schreiben dies in einem regulären Ausdruck, (einschließlich dem Verzeichnisnamen):

DISK1:[MYROOT.][MYDIR]FILE.DAT 

DISK1:[MYDIR]FILE.DAT 

[MYDIR]FILE.DAT 

FILE.DAT;10 

NODE::DISK5:[REMOTE.ACCESS]FILE.DAT 
+0

Ist der Text in den Klammern "[]" im obigen Beispiel ebenfalls optional? Sind "MYROOT.", "MYDIR" und "REMOTE.ACCESS" Aliase für etwas oder sind diese Zeichenfolgenliterale? –

+0

Soweit ich das beurteilen kann, sind die eckigen Klammern Litterals und nicht optional. Ich habe die genauen Spezifikationen für die zulässigen Verzeichnisnamen und Zeichen nicht gefunden. Mein Verständnis von der Spezifikation ist, dass die Verzeichnisnamen mit STRING Punkt STRING – bengrine

+0

identifiziert werden Beachten Sie auch, dass jeder Verzeichnisname und der Dateiname auf 9 Zeichen oder weniger beschränkt sind. Knoten und Gerät haben auch Längenbeschränkungen (aber ich erinnere mich nicht, was sie sind). –

Antwort

4

die Dokumentation und die Quelle für den VMS::Filespec Perl Modul.

+0

Danke - das sieht ziemlich gut aus ([^:] * ::)? ([^:] *:)? ([^> \]] * [> \]])? ([^;] *) (\.? [^;] *) ([.;]? \ d *) – bengrine

1

Sie könnten wahrscheinlich mit einem einzigen komplizierten Regex dafür kommen, aber es wird viel einfacher sein, Ihren Code zu lesen, wenn Sie Ihren Weg von links nach rechts arbeiten und jeden Abschnitt abstreifen, wenn er da ist. Hier finden Sie einige Python-Code, der tut genau das:

lines = ["DISK1:[MYROOT.][MYDIR]FILE.DAT", "DISK1:[MYDIR]FILE.DAT", "[MYDIR]FILE.DAT", "FILE.DAT;10", "NODE::DISK5:[REMOTE.ACCESS]FILE.DAT"] 
node_re = "(\w+)::" 
device_re = "(\w+):" 
root_re = "\[(\w+)\.]" 
dir_re = "\[(\w+)]" 
file_re = "(\w+)\." 
type_re = "(\w+)" 
version_re = ";(.*)" 
re_dict = {"node": node_re, "device": device_re, "root": root_re, "directory": dir_re, "file": file_re, "type": type_re, "version": version_re} 
order = ["node", "device", "root", "directory", "file", "type", "version"] 
for line in lines: 
    i = 0 
    print line 
    for item in order: 
     m = re.search(re_dict[item], line[i:]) 
     if m is not None: 
      print " " + item + ": " + m.group(1) 
      i += len(m.group(0)) 

und der Ausgang ist

DISK1:[MYROOT.][MYDIR]FILE.DAT 
    device: DISK1 
    root: MYROOT 
    directory: MYDIR 
    file: FILE 
    type: DAT 
DISK1:[MYDIR]FILE.DAT 
    device: DISK1 
    directory: MYDIR 
    file: FILE 
    type: DAT 
[MYDIR]FILE.DAT 
    directory: MYDIR 
    file: FILE 
    type: DAT 
FILE.DAT;10 
    file: FILE 
    type: DAT 
    version: 10 
NODE::DISK5:[REMOTE.ACCESS]FILE.DAT 
    node: NODE 
    device: DISK5 
    directory: REMOTE.ACCESS 
    file: FILE 
    type: DAT 
+0

Entschuldigung dafür, dass ich nicht klar bin - ich benutze das regexp in einer Lex-Datei – bengrine

+1

Kein Problem, meine Antwort war weniger über die Sprache und mehr die Strategie. Ich würde es hassen, '([^:] * ::)? ([^:] *:)? ([^>]] * [>]])? ([^;] *) (\.? [ ^;] *) ([.;]? \ d *) "Irgendwo in meinem Code ist manchmal Klarheit besser als Klugheit. –

3

Aus Wikipedia, die vollständige Form ist eigentlich ein bisschen mehr als das:

NODE"accountname password"::device:[directory.subdirectory]filename.type;ver 

Dieser Vorgang hat eine Weile gedauert, aber hier ist ein Ausdruck, der alle gültigen Variationen akzeptieren und die Komponenten in Erfassungsgruppen platzieren sollte.

(?:(?:(?:([^\s:\[\]]+)(?:"([^\s"]+) ([^\s"]+)")?::)?([^\s:\[\]]+):)?\[([^\s:\[\]]+)\])?([^\s:\[\]\.]+)(\.[^\s:\[\];]+)?(;\d+)? 

Auch von dem, was ich sagen kann, Ihr Beispiel von

DISK1:[MYROOT.][MYDIR]FILE.DAT 

ist kein gültiger Name. Ich glaube, dass nur ein Paar Klammern erlaubt ist. Ich hoffe das hilft!

+0

Ich vermute, dass dies ein Beispiel für ein verwurzeltes Verzeichnis ist. – EvilTeach

Verwandte Themen