2

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

(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

但是..这很难看,因为要么 要么23是空的。有没有办法将它与一个反向引用结合起来?

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

谢谢并恭祝安康

真实的

4

1 回答 1

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

但是[]如果它是 IPv6 地址,则必须去掉它。不过应该是相当微不足道的。

您也可以使用可选[]前后,然后环顾断言来做到这一点......但这真的很难看;如果您只是亲吻并使用上述方法,您的程序员同事会感谢您,但这里有一个选项:

(?:([^@]*)@)\[?((?<=\[).+(?=\])|([^:]+))\]?(?:\:(\d+))?
于 2011-05-29T00:04:27.950 回答