^(?:([a-zA-Z]+):)?(\/{0,3})([0-9.\-a-zA-Z]+)(?::(\d+))?(?:\/([^?#])*)?(?:\?([^#]*))?(?:#(.*))?$
详细:
此子表达式匹配协议 可以没有协议
^(?:([a-zA-Z]+):)?
^ //匹配行首开始
([a-zA-Z]+): //匹配协议
(\/{0,3})
//匹配//or ///([0-9.\-a-zA-Z]+)
//主机 字母,数字,.
(?::(\d+))?
端口
(?:\/([^?#])*)?
//path 除了?#
(?:\?([^#]*))? //参数 以?开始
[code="java"]
?:#(.*))?$
//#部分