干扰此regualr表达式适用于完整Windows文件夹路径
^([A-Za-z]:|\\{2}([-\w]+|((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))\\(([^"*/:?|<>\\,;[\]+=.\x00-\x20]|\.[.\x20]*[^"*/:?|<>\\,;[\]+=.\x00-\x20])([^"*/:?|<>\\,;[\]+=\x00-\x1F]*[^"*/:?|<>\\,;[\]+=\x00-\x20])?))\\([^"*/:?|<>\\.\x00-\x20]([^"*/:?|<>\\\x00-\x1F]*[^"*/:?|<>\\.\x00-\x20])?\\)*$
匹配
d:\
,\\Dpk\T c\
,E:\reference\h101\
,\\be\projects$\Wield\Rff\
,\\70.60.44.88\T d\SPC2\
非匹配
j:ohn\
,\\Dpk\
,G:\GD
,\\cae\.. ..\
,\\70.60.44\T d\SPC2\
问题:
这种表达需要“\
”路径结束。
如何编辑此表达式,以便用户可以输入路径
C:\Folder1
,C:\Folder 1\Sub Folder
答案 0 :(得分:5)
有两种方法可以解决这个问题:
第二种方法意味着您只需检查输入字符串是否以\
结尾。如果没有,那么只需将其添加,然后让正则表达式做到神奇。
我通常不会推荐这种无知的选择,但这可能是一个例外。
以下是我“解决”这个问题的方法:
那就是说,我们当然可以试着看看正则表达式。这是相同的模式,但是在自由间距/评论模式中重新格式化,即例如(?x)
。 Java的。
^
( [A-Za-z]:
| \\{2} ( [-\w]+
| (
(25[0-5]
|2[0-4][0-9]
|[01]?[0-9][0-9]?
)\.
){3}
(25[0-5]
|2[0-4][0-9]
|[01]?[0-9][0-9]?
)
)
\\ (
( [^"*/:?|<>\\,;[\]+=.\x00-\x20]
| \.[.\x20]* [^"*/:?|<>\\,;[\]+=.\x00-\x20]
)
( [^"*/:?|<>\\,;[\]+=\x00-\x1F]*
[^"*/:?|<>\\,;[\]+=\x00-\x20]
)?
)
)
\\ (
[^"*/:?|<>\\.\x00-\x20]
(
[^"*/:?|<>\\\x00-\x1F]*
[^"*/:?|<>\\.\x00-\x20]
)?
\\
)*
$
模式的主要骨架如下:
^
(head)
\\ (
bodypart
\\
)*
$
基于此更高级别的视图,在\
部分之后的?
上添加\\
,看起来可以支持可选的结尾(head)
:< / p>
^
(head)
\\?(
bodypart
\\?
)*
$
你通常应该非常警惕嵌套重复修饰符(在这种情况下?
内的*
),但对于这种特定模式,它是“好的”,因为bodypart
与\
不匹配。
答案 1 :(得分:1)
我根本不理解你的正则表达式 。但是我敢打赌你需要做的就是找到与尾随“\”匹配的一个或多个位,并在该位或那些位之后添加一个问号。
答案 2 :(得分:1)
您提供的正则表达式似乎与“C:\?tmp”不匹配,这是一个无效的Windows路径。
我找到了一个解决方案,但仅适用于Windows。您可以试试这个:
"^[A-Za-z]:(?:\\\\(?![\"*/:?|<>\\\\,;[\\]+=.\\x00-\\x20])[^\"*/:?|<>\\\\[\\]]+){0,}(?:\\\\)?$"
这个正则表达式忽略了最后一个阻碍你的“\”。
我已经在VS2005中使用pcre.lib(5.5)进行了测试。
希望它有所帮助!
答案 3 :(得分:0)
我知道这个问题大约有4年了,但以下内容可能就足够了:
string validWindowsOrUncPath = @"^(?:(?:[a-z]:)|(?:\\\\[^\\*\?\:;\0]*))(?:\\[^\\*\?\:;\0]*)+$";
(与IgnoreCase选项一起使用)。
编辑: 我甚至来到这个,它可以提取根和命名组中的每个部分:
string validWindowsOrUncPath = @"^(?<Root>(?:[a-z]:)|(?:\\\\[^\\*\?\:;\0]*))(?:\\(?<Part>[^\\*\?\:;\0]*))+$";