什么';是否使用正确的regexp模式来匹配VMS文件名?

什么';是否使用正确的regexp模式来匹配VMS文件名?,regex,filesystems,vms,Regex,Filesystems,Vms,(第5-1节)中的文档说明文件名应如下所示: node::device:[root.][directory-name]filename.type;version 其中大多数是可选的(如节点、设备、版本)-不确定是哪些以及如何在regexp中正确写入(包括目录名): 请参阅Perl模块的文档和源代码。您可能会为此想出一个复杂的正则表达式,但如果您从左到右剥离每个部分(如果有的话),阅读代码会容易得多。下面是一些Python代码,它们正是这样做的: lines = ["DISK1:[MYROOT.

(第5-1节)中的文档说明文件名应如下所示:

node::device:[root.][directory-name]filename.type;version
其中大多数是可选的(如节点、设备、版本)-不确定是哪些以及如何在regexp中正确写入(包括目录名):


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

您可能会为此想出一个复杂的正则表达式,但如果您从左到右剥离每个部分(如果有的话),阅读代码会容易得多。下面是一些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

从wikipedia上看,完整的表单实际上比这要多一些:

NODE"accountname password"::device:[directory.subdirectory]filename.type;ver
这需要一些时间,但是这里有一个表达式,它应该接受所有有效的变体,并将组件放入捕获组中

(?:(?:(?:([^\s:\[\]]+)(?:"([^\s"]+) ([^\s"]+)")?::)?([^\s:\[\]]+):)?\[([^\s:\[\]]+)\])?([^\s:\[\]\.]+)(\.[^\s:\[\];]+)?(;\d+)?
还有,据我所知,你的

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

不是有效的名称。我认为只允许使用一对括号。我希望这有帮助

上述示例中“[]”括号中的文本也是可选的吗?是“MYROOT.”、“MYDIR”和“REMOTE.ACCESS”的别名还是那些字符串文字?据我所知,方括号是普通的,不是可选的。我还没有找到允许的目录名和字符的确切规格。我对规范的理解是,目录名由STRING dot STRING标识。还请注意,每个目录名和文件名限制为9个字符或更少。节点和设备也有长度限制(但我不记得它们是什么)。@Loadmaster,我认为限制没有那么小;我记得创建的文件名为31个字符。DECnet第四阶段节点名是有限的,但第五阶段节点名可以是FQDN。在ODS-2卷上,文件名和扩展名限制为39个字符(大写和有限的特殊字符)。但在ODS-5卷(扩展文件名支持)上,文件名实际上是无限的,保留大小写并允许特殊字符,包括空格…我怀疑这是根目录的一个例子。谢谢-这看起来很好([^:::*::)?([^::::*:)([^>]*[>]])?([^.]*(\.?[^.]*)(\.?[^..].....].*)([.;]\d*))很抱歉不清楚-我在一个lex文件中使用regexp没有问题,我的回答不是关于语言,而是关于策略。我讨厌在我的代码中任何地方都有
([^:]*:)?([^:]*:)([^>]]*[>]])?([^.;]*)(\.?[^.]...].*)([.;].?\d*)
,有时候清晰比聪明好。
DISK1:[MYROOT.][MYDIR]FILE.DAT