如何编辑“完整Windows文件夹路径正则表达式”

时间:2010-07-12 05:31:38

标签: regex validation

干扰此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:\Folder1C:\Folder 1\Sub Folder

4 个答案:

答案 0 :(得分:5)

有两种方法可以解决这个问题:

  • 了解正则表达式(比必要的方式更难)并将其修复为您的规范(可能是错误的)
  • 谁在乎正则表达式如何做它的东西(它似乎做你需要的东西)并修改你的输入以符合你认为正则表达式的作用

第二种方法意味着您只需检查输入字符串是否以\结尾。如果没有,那么只需将其添加,然后让正则表达式做到神奇。

我通常不会推荐这种无知的选择,但这可能是一个例外。


Blackboxing

以下是我“解决”这个问题的方法:

  • 有一个神奇的盒子,谁知道它是如何工作的,但它有99%的时间
  • 我们希望它能100%有效地工作
  • 修复1%更简单,因此它可以与魔术盒一起使用,而不是固定魔术盒本身(因为这需要了解魔术盒的工作方式)。
  • 然后手动修复1%并单独留下魔术盒

解读黑魔法

那就是说,我们当然可以试着看看正则表达式。这是相同的模式,但是在自由间距/评论模式中重新格式化,即例如(?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]*))+$";