2011-09-21 60 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