2011-09-21 4 views
0

Regex newbie here. '\'로 끝나는 Windows 경로 이름 및 UNC 경로와 일치하는 정규식이 있습니다.Ruby Regex optimization

근무 예 : 잘못된

c:\windows\ 
c:\ 
\\server\share\ 
\\server\sh are\ 

: (적어도 난 그렇게 희망) 그러나 예상대로

c:\windows 
\\server 
\\server\share 
\\server\ share \ 

, 그것은 작동하지만, 그것은 매우 확대됨에 꽤 읽을하지, 그래서 어떤 팁 최적화가 크게 평가됩니다 ...

/\A(
    ([a-z]:\\(([a-zA-Z0-9äöüÄÖÜß_.$]+|[a-zA-Z0-9äöüÄÖÜß_.$]+[a-zA-Z0-9äöüÄÖÜß_.$\ ]*[a-zA-Z0-9äöüÄÖÜß_.$]+)\\)*)| 
    (\\\\(([a-zA-Z0-9äöüÄÖÜß_.$]+|[a-zA-Z0-9äöüÄÖÜß_.$]+[a-zA-Z0-9äöüÄÖÜß_.$\ ]*[a-zA-Z0-9äöüÄÖÜß_.$]+)\\)+(([a-zA-Z0-9äöüÄÖÜß_.$]+| 
    [a-zA-Z0-9äöüÄÖÜß_.$]+[a-zA-Z0-9äöüÄÖÜß_.$\ ]*[a-zA-Z0-9äöüÄÖÜß_.$]+)\\)+) 
)\z/ 
+0

엄청난 수의 유효한 파일 이름을 놓치고 있습니다 (많은 다른 문자가 허용됩니다). 문제가 아닙니까? 그리고 당신은 많은 잘못된 파일 이름을 허용하고 있습니다 (예를 들어'con.txt'). 당신은 정확히 무엇을 할 계획입니까? 유효성 검사? –

+0

또한 Ruby 버전은 무엇입니까? –

+0

이것에 대한 정보가 부족해서 죄송합니다. Ruby 1.9를 사용하고 있습니다. 유효성을 확인하려고합니다 ... – tobmatth

답변

4

루비 1.9에서 다음 작동합니다 :

if subject =~ 
    /\A(?:(?!.*\\(?:con|prn|aux|nul|com\d|lpt\d)\\) # exclude invalid names 
    (?:            # Either match   
    [a-z]:\\          # drive letter 
    |            # or 
    \\\\(?:[^\\\/:*?"<>|\s]+\\){2}     # UNC share name 
    )            # End of alternation 
    (?:            # Try to match: 
    (?!\s)           # (Assert no starting space) 
    [^\\\/:*?"<>|\r\n]+        # a valid directory name 
    (?<!\s)           # (Assert no ending space) 
    \\            # backslash 
    )*            # repeat as needed 
    )\Z/mix 
    # Successful match 
else 
    # Match attempt failed 
end 
+0

공유 이름없이 UNC 경로를 허용하지만 (\\ 서버 \\), 이 일을하고 그것을 내 regzilla, 감사 덕분에 청소기 보입니다 ... – tobmatth

+0

아, 좋아, 그들이 허용해서는 안됩니다? 문제 없어. –

+0

흠, 아직 \\ 서버 \ 수 있습니다. (의사 코드)와 같지 않습니다 : 적어도 하나 이상의 유효한 디렉토리 이름이 필요하다면 unc 공유가 필요합니까? – tobmatth