Какой правильный шаблон Regexp в соответствии с именем файла виртуальной машины?

StackOverflow https://stackoverflow.com/questions/4464772

  •  11-10-2019
  •  | 
  •  

Вопрос

Документация в http://h71000.www7.hp.com/doc/731final/documentation/pdf/ovms_731_file_app.pdf (Раздел 5-1) говорит, что имя файла должно выглядеть так:

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

Большинство из них необязательны (например, узл, устройство, версия) - не уверены, какие из них и как правильно написать это в режиме REGEXP (включая имя каталога):

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

DISK1:[MYDIR]FILE.DAT

[MYDIR]FILE.DAT

FILE.DAT;10

NODE::DISK5:[REMOTE.ACCESS]FILE.DAT
Это было полезно?

Решение

Смотрите документацию и источник для VMS :: filepec Модуль Perl.

Другие советы

Из Википедии полная форма на самом деле немного больше, чем эта:

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

Это заняло некоторое время, но вот выражение, которое должно принять все достоверные вариации и поместить компоненты в группы захвата.

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

Кроме того, из того, что я могу сказать, ваш пример

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

не является действительным именем. Я считаю, что разрешена только одна пара скобок. Надеюсь, это поможет!

Возможно, вы могли бы придумать одну сложную регуляцию для этого, но будет гораздо проще читать ваш код, если вы будете работать слева от слева к правой части, если он есть. Ниже приведено какой -то код Python, который делает именно это:

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))

и выход

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top