关于正则表达式:与VMS文件名匹配的正确正则表达式模式是什么?

What's the correct regexp pattern to match a VMS filename?

http://h71000.www7.hp.com/doc/731final/documentation/pdf/ovms_731_file_app.pdf(第5-1节)中的文档说文件名应如下所示:

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

它们中的大多数是可选的(如节点,设备,版本) - 不确定哪些以及如何在正则表达式中正确编写它(包括目录名称):

1
2
3
4
5
6
7
8
9
DISK1:[MYROOT.][MYDIR]FILE.DAT

DISK1:[MYDIR]FILE.DAT

[MYDIR]FILE.DAT

FILE.DAT;10

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


请参阅VMS :: Filespec Perl模块的文档和源代码。


从维基百科,完整的表格实际上不仅仅是:

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

这个花了一段时间,但这里有一个表达式应该接受所有有效的变体,并将组件放入捕获组。

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

另外,从我所知道的,你的例子

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

不是有效的名称。 我相信只允许一对括号。 我希望这有帮助!


你可能会为此提出一个复杂的正则表达式,但是如果你从左到右按照每个部分的方式工作,那么读取你的代码要容易得多。 以下是一些Python代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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))

而输出是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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