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
答案 0 :(得分:4)
请参阅VMS::Filespec Perl模块的文档和来源。
答案 1 :(得分:3)
从维基百科来看,完整形式实际上不仅仅是:
NODE"accountname password"::device:[directory.subdirectory]filename.type;ver
这个花了一段时间,但这里有一个表达式,应该接受所有有效的变体,并将组件放入捕获组。
(?:(?:(?:([^\s:\[\]]+)(?:"([^\s"]+) ([^\s"]+)")?::)?([^\s:\[\]]+):)?\[([^\s:\[\]]+)\])?([^\s:\[\]\.]+)(\.[^\s:\[\];]+)?(;\d+)?
另外,据我所知,你的例子是
DISK1:[MYROOT.][MYDIR]FILE.DAT
不是有效名称。我相信只允许一对括号。我希望这有帮助!
答案 2 :(得分:1)
你可能会为此提出一个复杂的正则表达式,但是如果你从左到右按照每个部分的方式工作,那么读取你的代码要容易得多。以下是一些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