【问题标题】:Regex matching url authority parts正则表达式匹配 url 权限部分
【发布时间】:2011-09-04 03:22:51
【问题描述】:

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

(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 的正则表达式引擎。

感谢和问候

真实

【问题讨论】:

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


    【解决方案1】:
    (?:([^@]*)@)(\[.+\]|([^:]+))(?:\:(\d+))?
    

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

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

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

    【讨论】:

    • 谢谢。如果没有其他办法,我会这样做。但我希望有人有一个疯狂的想法。 :)
    • 嗯,另一种方法是将[?]? 放在捕获之外,然后在查询中放置零宽度的lookbehind 和lookahead 断言。稍等片刻,我将添加该示例。
    • 好的,说服了。 :) 我会使用上面的。
    猜你喜欢
    • 2020-01-02
    • 2011-06-13
    • 1970-01-01
    • 2015-04-12
    • 2017-11-29
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多