This is a BNF-like description of the Uniform Resource Locator syntax. A vertical line "|" indicates alternatives, and [brackets] indicate optional parts. Spaces are represented by the word "space", and the vertical line character by "vline". Single letters stand for single letters. All words of more than one letter below are entities described somewhere in this description.
The current IETF URI Working Group preference is for the prefixedurl production. (Nov 1993. July 93: url).
The "national" and "punctuation" characters do not appear in any productions and therefore may not appear in URLs.
The "afsaddress" is left in as historical note, but is not a url production.
prefixedurl u r l : url url httpaddress | ftpaddress | newsaddress | nntpaddress | prosperoaddress | telnetaddress | gopheraddress | waisaddress | mailtoaddress | midaddress | cidaddress scheme ialpha httpaddress h t t p : / / hostport [ / path ] [ ? search ] ftpaddress f t p : / / login / path [ ftptype ] afsaddress a f s : / / cellname / path newsaddress n e w s : groupart nntpaddress n n t p : group / digits midaddress m i d : addr-spec cidaddress c i d : content-identifier mailtoaddress m a i l t o : xalphas @ hostname waisaddress waisindex | waisdoc waisindex w a i s : / / hostport / database [ ? search ] waisdoc w a i s : / / hostport / database / wtype / wpath wpath digits = path ; [ wpath ] groupart * | group | article group ialpha [ . group ] article xalphas @ host database xalphas wtype xalphas prosperoaddress prosperolink prosperolink p r o s p e r o : / / hostport / hsoname [ % 0 0 version [ attributes ] ] hsoname path version digits attributes attribute [ attributes ] attribute alphanums telnetaddress t e l n e t : / / login gopheraddress g o p h e r : / / hostport [/ gtype [ gcommand ] ] login [ user [ : password ] @ ] hostport hostport host [ : port ] host hostname | hostnumber ftptype A formcode | E formcode | I | L digits formcode N | T | C cellname hostname hostname ialpha [ . hostname ] hostnumber digits . digits . digits . digits port digits gcommand path path void | segment [ / path ] segment xpalphas search xalphas [ + search ] user alphanum2 [ user ] password alphanum2 [ password ] fragmentid xalphas gtype xalpha alphanum2 alpha | digit | - | _ | . | + xalpha alpha | digit | safe | extra | escape xalphas xalpha [ xalphas ] xpalpha xalpha | + xpalphas xpalpha [ xpalphas ] ialpha alpha [ xalphas ] alpha a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z digit 0 |1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 safe $ | - | _ | @ | . | & | + | - extra ! | * | " | ' | ( | ) | , reserved = | ; | / | # | ? | : | space escape % hex hex hex digit | a | b | c | d | e | f | A | B | C | D | E | F national { | } | vline | [ | ] | \ | ^ | ~ punctuation < | > digits digit [ digits ] alphanum alpha | digit alphanums alphanum [ alphanums ] void (end of URL BNF)