我需要匹配以下字符串的这些部分:
(user)@(hostname):(port)
可以选择匹配用户和端口。 首先,我用这个正则表达式管理它:
(?:([^@]*)@)?([^\:]+)(?:\:(\d+))?
匹配foo@bar:80
foo
bar
80
但是当谈到像foo@[2001:0db8:85a3:08d3:1319:8a2e:0370:7344]:80
这样的IPv6主机时,前面的正则表达式将无法正常工作:
foo
[2001
0
所以现在我正在思考一个正则表达式,它也可以匹配带有冒号的方括号封闭主机,但没有方括号。 :) 我用以下正则表达式完成了这个:
(?:([^@]*)@)(?:\[(.+)\]|([^:]+))(?:\:(\d+))?
foo
2001:0db8:85a3:08d3:1319:8a2e:0370:7344
<empty>
80
但是......这很难看,因为2
或3
都是空的。
有没有办法将其与一个反向引用相结合?
我正在使用boost :: regex,就我所知,它使用perl的正则表达式引擎。
谢谢和问候
reeaal
答案 0 :(得分:2)
(?:([^@]*)@)(\[.+\]|([^:]+))(?:\:(\d+))?
但如果它是IPv6地址,你将不得不剥离[]
。应该是相当微不足道的。
您也可以使用可选的[
和]
之前和之后执行此操作,然后查看断言...但这真的很难看;你的同事们会感谢你,如果你只是KISS并使用上述内容,但这里有选项:
(?:([^@]*)@)\[?((?<=\[).+(?=\])|([^:]+))\]?(?:\:(\d+))?