Существует не так много способов регулярного выражения URL, который соответствует rfc3986
Как строка C, регулярное выражение будет:
"^(([^:/?#]+):)?(//([^/?#]*)|///)?([^?#]*)(\\?[^#]*)?(#.*)?"
enum {
URL = 0,
SCHEME_CLN = 1,
SCHEME = 2,
DSLASH_AUTH = 3,
AUTHORITY = 4,
PATH = 5,
QUERY = 6,
FRAGMENT = 7
};
Где перечисление обозначает, какие индексы захвата соответствуют каким частям URL.