Was ist der richtige RegexMuster einen VMS-Dateinamen übereinstimmen?
-
11-10-2019 - |
Frage
Die Dokumentation unter http: //h71000.www7.hp .com / doc / 731final / Dokumentation / pdf / ovms_731_file_app.pdf (Abschnitt 5-1) sagt der Dateiname soll wie folgt aussehen:
node::device:[root.][directory-name]filename.type;version
Die meisten von ihnen sind optional (wie Knoten, Gerät, Version) - nicht sicher, welche und wie richtig diese in einem regulären Ausdruck schreiben, (einschließlich der Verzeichnisname):
DISK1:[MYROOT.][MYDIR]FILE.DAT
DISK1:[MYDIR]FILE.DAT
[MYDIR]FILE.DAT
FILE.DAT;10
NODE::DISK5:[REMOTE.ACCESS]FILE.DAT
Lösung
Sehen Sie die Dokumentation und die Quelle für die VMS :: Filespec Perl-Modul.
Andere Tipps
Aus Wikipedia, die vollständigen Form ist eigentlich ein bisschen mehr als das:
NODE"accountname password"::device:[directory.subdirectory]filename.type;ver
nahm Dieser eine Weile, aber hier ist ein Ausdruck, der alle gültigen Varianten annehmen sollte, und legen Sie die Komponenten in Einfanggruppen.
(?:(?:(?:([^\s:\[\]]+)(?:"([^\s"]+) ([^\s"]+)")?::)?([^\s:\[\]]+):)?\[([^\s:\[\]]+)\])?([^\s:\[\]\.]+)(\.[^\s:\[\];]+)?(;\d+)?
Auch von dem, was kann ich sagen, Ihr Beispiel von
DISK1:[MYROOT.][MYDIR]FILE.DAT
ist kein gültiger Name. Ich glaube, nur ein Paar von Klammern erlaubt ist. Ich hoffe, das hilft!
Sie könnten wahrscheinlich mit einem einzigen komplizierten Regex für diese kommen, aber es wird viel einfacher sein, den Code zu lesen, wenn Sie Ihren Weg von links nach rechts Abstreifen jeden Abschnitt, wenn es da ist. Hier finden Sie einige Python-Code, der genau das tut:
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 die Ausgabe 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