正则表达式匹配url权限部分

时间:2011-05-29 00:01:39

标签: c++ regex url boost-regex authority

我需要匹配以下字符串的这些部分:

(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

但是......这很难看,因为23都是空的。 有没有办法将其与一个反向引用相结合?

我正在使用boost :: regex,就我所知,它使用perl的正则表达式引擎。

谢谢和问候

reeaal

1 个答案:

答案 0 :(得分:2)

(?:([^@]*)@)(\[.+\]|([^:]+))(?:\:(\d+))?

但如果它是IPv6地址,你将不得不剥离[]。应该是相当微不足道的。

您也可以使用可选的[]之前和之后执行此操作,然后查看断言...但这真的很难看;你的同事们会感谢你,如果你只是KISS并使用上述内容,但这里有选项:

(?:([^@]*)@)\[?((?<=\[).+(?=\])|([^:]+))\]?(?:\:(\d+))?