Какой правильный шаблон регулярного выражения соответствует имени файла VMS? - PullRequest
3 голосов
/ 16 декабря 2010

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

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

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

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

DISK1:[MYDIR]FILE.DAT

[MYDIR]FILE.DAT

FILE.DAT;10

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

Ответы [ 3 ]

4 голосов
/ 16 декабря 2010

См. Документацию и источник для VMS :: Filespec модуля Perl.

3 голосов
/ 17 декабря 2010

Из википедии полная форма на самом деле немного больше:

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

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

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

Кроме того, насколько я могу судить, ваш пример

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

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

1 голос
/ 16 декабря 2010

Возможно, вы могли бы придумать для этого одно сложное регулярное выражение, но вам будет намного легче читать ваш код, если вы будете проходить слева направо, удаляя каждый раздел, если он там есть.Ниже приведен некоторый код 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
...