2011-09-21 65 views
0

正則表達式新手在這裏。我有一個匹配Windows路徑名和UNC路徑的正則表達式,以'\'結尾。Ruby正則表達式優化

工作的例子:

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

在Ruby 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

嗯,這仍然允許\\服務器\。是不是像(僞代碼):如果共享至少需要一個有效的目錄名稱需要? – tobmatth