¿Cuál es el patrón de expresión correcta para que coincida con un nombre de archivo VMS?
-
11-10-2019 - |
Pregunta
La documentación en http: //h71000.www7.hp .com / doc / 731final / documentación / pdf ovms_731_file_app.pdf (sección 5-1) / dice el nombre del archivo debe tener este aspecto:
node::device:[root.][directory-name]filename.type;version
La mayoría de ellos son opcionales (como nodo, dispositivo, la versión) - no está seguro de cuáles y cómo escribir correctamente esto en una expresión regular, (incluyendo el nombre del directorio):
DISK1:[MYROOT.][MYDIR]FILE.DAT
DISK1:[MYDIR]FILE.DAT
[MYDIR]FILE.DAT
FILE.DAT;10
NODE::DISK5:[REMOTE.ACCESS]FILE.DAT
Solución
Consulte la documentación y la fuente para la VMS :: Filespec Perl módulo.
Otros consejos
De Wikipedia, la forma completa es en realidad un poco más que eso:
NODE"accountname password"::device:[directory.subdirectory]filename.type;ver
Éste tomó un tiempo, pero aquí es una expresión que debe aceptar todas las variaciones válidas, y colocar los componentes en grupos de captura.
(?:(?:(?:([^\s:\[\]]+)(?:"([^\s"]+) ([^\s"]+)")?::)?([^\s:\[\]]+):)?\[([^\s:\[\]]+)\])?([^\s:\[\]\.]+)(\.[^\s:\[\];]+)?(;\d+)?
Además, por lo que puede decir, su ejemplo de
DISK1:[MYROOT.][MYDIR]FILE.DAT
no es un nombre válido. Creo que sólo un par de soportes están permitidos. Espero que esto ayude!
Probablemente se podría llegar a una sola expresión regular complicado para esto, pero será mucho más fácil de leer su código si su forma de trabajo de izquierda a derecha de extracción cada sección si está allí. El siguiente es un código Python que hace precisamente eso:
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))
y la salida es
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