我想从这样的字符串中提取主机名和端口号:stackoverflow.com:443。这很容易。我可以做这样的事情:(?.*):(?\d*)。我不担心协议方案或有效的主机名/IP地址或TCP/UDP端口,这对我的请求不重要。然而,我还需要支持一个细节,这使得它超出了我对正则表达式的了解——没有端口的主机名:stackoverflow.com。我想使用单个正则表达式,并且我想使用命名捕获组,使得主机组始终存在于正匹配中,而端口组仅在我们有冒号后跟数字时存在。我尝试从我对它的肤浅理解中进行积极的回溯:(?.*)(?<=:)(?\d*)。这来得比较接近,但冒号(:)包含在主机捕获的末尾。所以我试图改变主机,让它包括除冒号之外的任何东西,就像这样:(?[^:]*) (?<=:)(?\d*)。这给了我一个空的主机捕获。有什么建议吗?即使冒号和端口号是可选的,但如果它们存在,包括端口号捕获并使冒号“消失”?