2010-12-16 3 views
3

http://h71000.www7.hp.com/doc/731final/documentation/pdf/ovms_731_file_app.pdf (섹션 5-1)에서 문서 파일 이름은 다음과 같이해야한다고 말했습니다 :VMS 파일명과 일치하는 올바른 regexp 패턴은 무엇입니까?

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

위 예의 "[]"대괄호 안에있는 텍스트도 선택적입니까? "MYROOT.", "MYDIR"및 "REMOTE.ACCESS"가 별칭입니까? 아니면 문자열 리터럴입니까? –

+0

내가 알 수있는 한, 대괄호는 쓰레기이며 선택적이 아닙니다. 허용 된 디렉토리 이름 및 문자에 대한 정확한 스펙을 찾지 못했습니다. 사양에서 나의 이해는 디렉토리 이름은 STRING으로 식별됩니다. STRING – bengrine

+0

또한 각 디렉토리 이름과 파일 이름은 9 자 이하로 제한됩니다. 노드와 장치에도 길이 제한이 있습니다 (그러나 그 내용은 기억이 안납니다). –

답변

4

VMS::Filespec 펄 모듈에 대한 문서와 소스를 참조하십시오.

+0

([^ :] *)) ([^ :] *) :([^> \]] * [> \]]) ([ \\? [^ ;;] *) ([.;]? \ d *) – bengrine

1

당신은 아마 이것에 대한 하나의 복잡한 정규식을 생각해 낼 수 있습니다.하지만 각 섹션을 왼쪽에서 오른쪽으로 떼어 내면 코드를 읽는 것이 훨씬 쉬울 것입니다. 다음은 그냥 않는 일부 파이썬 코드 :

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 
+0

미안합니다. - lex 파일에서 regexp를 사용하고 있습니다. – bengrine

+1

문제는 없습니다. 전략. 나는 ([^ :] *)() ([^ :] * :)() ([^ :] *)^.;] *) ([.;]? \ d *)'어디에서나 사용할 수 있습니다. 때로는 선명도가 영리함보다 낫습니다. –

3

는 전체 형태가 실제보다 조금 더입니다 :

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

이 작업에는 잠시 시간이 걸렸지 만 모든 유효한 변형을 허용하고 캡처 구성 요소를 캡처 그룹에 배치하는 표현식이 있습니다. 또한

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

, 내가 말할 수있는 것과,

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

당신의 예는 유효한 이름이 아닙니다. 나는 한 쌍의 대괄호 만 허용한다고 믿는다. 이게 도움이 되길 바란다!

+0

그게 루트 디렉토리의 예라고 생각합니다. – EvilTeach

관련 문제