我需要匹配以下字符串的这些部分:
(user)@(hostname):(port)
可以选择匹配用户和端口。首先我用这个正则表达式管理它:
(?:([^@]*)@)?([^\:]+)(?:\:(\d+))?
这匹配foo@bar:80
foo
bar
80
但是当涉及到 IPv6 主机时foo@[2001:0db8:85a3:08d3:1319:8a2e:0370:7344]:80
,前面的正则表达式将无法按预期工作:
foo
[2001
0
所以现在我正在思考一个正则表达式,它也可以用冒号匹配方括号括起来的主机,但没有方括号。:) 我用下面的正则表达式做到了:
(?:([^@]*)@)(?:\[(.+)\]|([^:]+))(?:\:(\d+))?
foo
2001:0db8:85a3:08d3:1319:8a2e:0370:7344
<empty>
80
但是..这很难看,因为要么 要么2
将3
是空的。有没有办法将它与一个反向引用结合起来?
我正在使用 boost::regex,据我所知,它使用 perl 的正则表达式引擎。
谢谢并恭祝安康
真实的