RFC-3986 Приложение B. дает нам это регулярное выражение для декомпозиции универсального URI:
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
Поскольку вы заинтересованы в том, чтобы собрать все до пути, вотэквивалентное регулярное выражение, которое должно работать довольно хорошо (в синтаксисе PHP, чтобы разрешить комментарии):
$re = '%# Match URI and capture scheme and path in $1.
^ # Anchor to beginning of string.
( # $1: Everything up to path.
(?: [^:/?#]+:)? # Optional scheme.
(?://[^/?#]* )? # Optional authority.
) # End $1: Everything up to path.
[^?#]* # Required path.
(?:\? [^#]* )? # Optional query.
(?:\# .* )? # Optional fragment.
$ # Anchor to end of string.
%x';
А вот точно такое же регулярное выражение в краткой форме, которое должно работать в VB:
myRegExp.Pattern = "^((?:[^:/?#]+:)?(?://[^/?#]*)?)[^?#]*(?:\?[^#]*)?(?:#.*)?$"
Это регулярное выражение не проверяет URI, оно просто разбивает его на различные компоненты и выделяет нужную часть в группу захвата 1. Обратите внимание, что каждый компонент, кроме пути, является необязательным (и сам путь может быть пустым).).Другими словами, пустая строка является допустимым URI!