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

C++ 正则表达式匹配url权限部分,c++,regex,url,boost-regex,authority,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 所以现在我在考虑一个正则表达式,它也可以将方括

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

(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
(?:([^@]*)@)(?:\[(.+)\]\]|([^::+)(?:\:(\d+))?
福
2001:0db8:85a3:08d3:1319:8a2e:0370:7344
80
但是。。这很难看,因为
2
3
将为空。 有没有办法将此合并为一个反向引用

我正在使用boost::regex,据我所知,它使用perl的regex引擎

谢谢和问候

里亚尔

但是如果它是IPv6地址,则必须去掉
[]
。但这应该是相当琐碎的

您还可以在前后使用可选的
[
]
,然后查找断言。。。但那真的很难看;如果您只是亲吻并使用上面的内容,您的程序员同事会感谢您,但这里有一个选项:

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

(?:([^@]*)\[?(?谢谢。如果没有其他方法,我会这样做。但我希望有人有一个疯狂的想法。:)好吧,另一种方法是把
[?
]?
在捕获之外,然后将零宽度的lookbehind和lookbeahead断言放入查询中。稍等,我将添加该示例。好的,我将使用上面的。
(?:([^@]*)@)\[?((?<=\[).+(?=\])|([^:]+))\]?(?:\:(\d+))?