使用MSDN作为参考,这里是一个正则表达式来捕获UNC路径的各个部分:
/^\\\\([^\\:\|\[\]\/";<>+=,?* _]+)\\([\u0020-\u0021\u0023-\u0029\u002D-\u002E\u0030-\u0039\u0040-\u005A\u005E-\u007B\u007E-\u00FF]{1,80})(((?:\\[\u0020-\u0021\u0023-\u0029\u002D-\u002E\u0030-\u0039\u0040-\u005A\u005E-\u007B\u007E-\u00FF]{1,255})+?|)(?:\\((?:[\u0020-\u0021\u0023-\u0029\u002B-\u002E\u0030-\u0039\u003B\u003D\u0040-\u005B\u005D-\u007B]{1,255}){1}(?:\:(?=[\u0001-\u002E\u0030-\u0039\u003B-\u005B\u005D-\u00FF]|\:)(?:([\u0001-\u002E\u0030-\u0039\u003B-\u005B\u005D-\u00FF]+(?!\:)|[\u0001-\u002E\u0030-\u0039\u003B-\u005B\u005D-\u00FF]*)(?:\:([\u0001-\u002E\u0030-\u0039\u003B-\u005B\u005D-\u00FF]+)|))|)))|)$/
细分如下:
/^\\\\ - 匹配以两个反斜杠开头的字符串\\\\
() - 捕获 (1)(主机名)
[^\\:\|\[\]\/";<>+=,?* _]+ - 匹配任何字符序列,不包括\\:\|\[\]\/";<>+=,?* _,一次或多次
\\ - 匹配文字反斜杠\\
() - 捕获 (2)(共享名称)
[\u0020-\u0021\u0023-\u0029\u002D-\u002E\u0030-\u0039\u0040-\u005A\u005E-\u007B\u007E-\u00FF]{1,80} - 匹配 1 到 80 个字符的任意序列,匹配 !#$%'()\-\.0-9@A-Z^_`a-z{}~ 和 Latin-1 Unicode 补充
( - 开始捕获 (3)(对象名称)
( - 开始捕获 (4)(路径名)
(?:\\[\u0020-\u0021\u0023-\u0029\u002D-\u002E\u0030-\u0039\u0040-\u005A\u005E-\u007B\u007E-\u00FF]{1,255})+? - 捕获但不记得 \\ 文字后跟一个或多个匹配 !#$%'()\-\.0-9@A-Z^_`a-z{}~ 和 Latin-1 Unicode 补充的 1 到 255 个字符的序列,并且不贪婪地这样做 (5)
|) - 或不捕获任何内容 (4)(路径名)
(?: - 开始捕获但不记得 (6)
\\ - 匹配 \\ 文字
( - 开始捕获 (7)(文件名)
(?:[0-9a-z]{1,255}){1} - 捕获但不记得与!#$%'()\+,\-\.0-9;=@A-Z\[\]^_`a-z{ 匹配的 1 到 255 个字符的序列 (8)
(?: - 开始捕获但不记得 (9)
\:(?=[\u0001-\u002E\u0030-\u0039\u003B-\u005B\u005D-\u00FF]|\:) - 仅当后跟 \u0001-\u002E\u0030-\u0039\u003B-\u005B\u005D-\u00FF 或文字 : 时才匹配文字 :
(?: - 开始捕获但不记得 (10)
([\u0001-\u002E\u0030-\u0039\u003B-\u005B\u005D-\u00FF]+(?!\:)|[\u0001-\u002E\u0030-\u0039\u003B-\u005B\u005D-\u00FF]*) - 捕获一个或多个字符的序列,后面没有文字:;否则,捕获 0 个或多个字符的序列 (11)(流名称)
(?: - 开始捕获但不记得 (12)
\: - 匹配文字 :
([\u0001-\u002E\u0030-\u0039\u003B-\u005B\u005D-\u00FF]+) - 捕获一个或多个字符的序列 (13)(流类型)
|) - 或者什么都不捕获 (12)
) - 结束捕获 (10)
|) - 或者什么都不捕获 (9)
) - 结束捕获 (7)(文件名)
) - 结束捕获 (6)
|) - 或不捕获任何内容 (3)(对象名称)
$/ - 字符串结束
几点说明:
- 正则表达式匹配整个字符串。
-
主机名和共享名都是必需才能使此正则表达式匹配。
- 主机名匹配不严格(通过 4 个 RFC 指定:3986、1035、1123 和 4291)。因此,可能会出现一些误报。如果需要严格验证主机名,请捕获主机名并独立于该正则表达式进行测试。
-
绝不允许使用尾随
\\。
有关 JavaScript 库实现,包括测试和示例,请参阅 here。