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

SOF*_*ser 1 regex validation

Hay这个regualr表达式适用于Full Windows Folder Path

^([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])?\\)*$
Run Code Online (Sandbox Code Playgroud)

火柴
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

pol*_*nts 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]
      )?
      \\
   )*
$
Run Code Online (Sandbox Code Playgroud)

该模式的主要骨架如下:

^
(head)
\\ (
      bodypart
      \\
   )*
$
Run Code Online (Sandbox Code Playgroud)

基于这个更高级别的视图,看起来\可以通过添加以下?两个部分来支持可选的尾随:\\(head)

^
(head)
\\?(
      bodypart
      \\?
   )*
$
Run Code Online (Sandbox Code Playgroud)

参考


关于灾难性回溯的说明

你通常应该非常警惕嵌套重复修饰符(在这种情况下是一个?内部*),但对于这个特定的模式,它是"好的",因为bodypart它不匹配\.

参考