【问题标题】:Write regex without negations写没有否定的正则表达式
【发布时间】:2015-10-28 19:53:24
【问题描述】:

在之前的post 中,我曾寻求一些帮助,以便在没有否定的情况下重写正则表达式

开始正则表达式:

https?:\/\/(?:.(?!https?:\/\/))+$

结束了:

https?:[^:]*$

这很好用,但我注意到如果我的 URL 中除了来自 http\s 的 : 之外还有 :,它不会选择。

这是一个不起作用的字符串:

sometextsometexhttp://websites.com/path/subpath/#query1sometexthttp://websites.com/path/subpath/:query2

你可以注意到:query2

如何修改此处列出的第二个正则表达式,以便它选择包含: 的网址。

预期输出:

http://websites.com/path/subpath/cc:query2

我还想选择所有内容,直到第一次出现?=param

输入: sometextsometexhttp://websites.com/path/subpath/#query1sometexthttp://websites.com/path/subpath/cc:query2/text/?=param

输出:

http://websites.com/path/subpath/cc:query2/text/

【问题讨论】:

    标签: regex go regex-negation


    【解决方案1】:

    遗憾的是 Go 正则表达式不支持环视。 但是,您可以通过一种技巧获得最后一个链接:贪婪地匹配所有可能的链接和其他字符,并使用捕获组捕获最后一个链接:

    ^(?:https?://|.)*(https?://\S+?)(?:\?=|$)
    

    \S*? 惰性空格匹配一起,这还可以捕获到?= 的链接。

    regex demoGo demo

    var r = regexp.MustCompile(`^(?:https?://|.)*(https?://\S+?)(?:\?=|$)`)
    fmt.Printf("%q\n", r.FindAllStringSubmatch("sometextsometexhttp://websites.com/path/subpath/#query1sometexthttp://websites.com/path/subpath/:query2", -1)[0][1])
    fmt.Printf("%q\n", r.FindAllStringSubmatch("sometextsometexhttp://websites.com/path/subpath/#query1sometexthttp://websites.com/path/subpath/cc:query2/text/?=param", -1)[0][1])
    

    结果:

    "http://websites.com/path/subpath/:query2"
    "http://websites.com/path/subpath/cc:query2/text/"
    

    如果最后一个链接中有空格,请使用.+?

    ^(?:https?://|.)*(https?://.+?)(?:\?=|$)
    

    【讨论】:

    • 老兄!你太棒了!!
    • 当不需要重叠匹配并且没有环视支持时,总有一种方法可以使用捕获正则表达式功能获取所需的子字符串。
    猜你喜欢
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    相关资源
    最近更新 更多