Quel est le motif d'exprat correct pour correspondre à un nom de fichier VMS?
-
11-10-2019 - |
Question
La documentation http: //h71000.www7.hp .com / doc / 731final / documentation / pdf / ovms_731_file_app.pdf (section 5-1) indique le nom du fichier devrait ressembler à ceci:
node::device:[root.][directory-name]filename.type;version
La plupart d'entre eux sont en option (comme noeud, dispositif, version) - pas sûr ceux et comment écrire correctement ce dans une expression rationnelle, (y compris le nom du répertoire):
DISK1:[MYROOT.][MYDIR]FILE.DAT
DISK1:[MYDIR]FILE.DAT
[MYDIR]FILE.DAT
FILE.DAT;10
NODE::DISK5:[REMOTE.ACCESS]FILE.DAT
La solution
Consultez la documentation et source pour le VMS :: Filespec Perl module.
Autres conseils
De wikipedia, la forme complète est en fait un peu plus que cela:
NODE"accountname password"::device:[directory.subdirectory]filename.type;ver
Celui-ci a pris un certain temps, mais voici une expression qui devrait accepter toutes les variations valides, et placer les composants en groupes de capture.
(?:(?:(?:([^\s:\[\]]+)(?:"([^\s"]+) ([^\s"]+)")?::)?([^\s:\[\]]+):)?\[([^\s:\[\]]+)\])?([^\s:\[\]\.]+)(\.[^\s:\[\];]+)?(;\d+)?
En outre, d'après ce que je peux dire, votre exemple de
DISK1:[MYROOT.][MYDIR]FILE.DAT
est pas un nom valide. Je crois qu'une seule paire de supports sont autorisés. J'espère que cela aide!
Vous pourriez probablement venir avec un seul regex compliqué pour cela, mais il sera beaucoup plus facile à lire votre code si vous travaillez votre chemin de gauche à droite de décapage de chaque section si elle est là. Ce qui suit est un code Python qui fait exactement cela:
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))
et la sortie est
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