Использование 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
(
- начать захват (3) (имя объекта)
(
- начать захват (4) (имя пути)
(?:\\[\u0020-\u0021\u0023-\u0029\u002D-\u002E\u0030-\u0039\u0040-\u005A\u005E-\u007B\u007E-\u00FF]{1,255})+?
- перехватить, но не запомнить литерал \\
, за которым следуют одна или несколько последовательностей от 1 до 255 символов, соответствующих !#$%'()\-\.0-9@A-Z^_`a-z{}~
и дополнению Latin-1 Unicode, и делать это без жадности (5)
|)
- ИЛИ ничего не захватывать (4) (имя пути)
(?:
- начать захват, но не помню (6)
\\
- соответствует \\
литерал
(
- начать захват (7) (имя файла)
(?:[0-9a-z]{1,255}){1}
- захватить, но не запомнить последовательность от 1 до 255 символов, соответствующих !#$%'()\+,\-\.0-9;=@A-Z\[\]^_`a-z{
(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, включая тесты и примеры, см. здесь .