编写没有否定的正则表达式

Write regex without negations

在之前的 中,我曾寻求一些关于重写正则表达式而不取反的帮助

开始正则表达式:

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

最后:

https?:[^:]*$

这很好用,但我注意到如果我的 URL 中有 : 除了 http\s 中的 :,它不会 select.

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

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

你可以注意到 :query2

我如何修改此处列出的第二个正则表达式,使其 select 包含 :.

的网址

预期输出:

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

我也想 select 一切直到第一次出现 ?=param

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

输出:

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

遗憾的是Go regex不支持lookarounds。 但是,您可以通过一种技巧获得最后一个 link:贪婪地匹配所有可能的 link 和其他字符,并使用捕获组捕获最后一个 link:

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

连同 \S*? 惰性空格匹配,这也可以捕获 link 到 ?=

regex demo and Go 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/"

如果最后一个 link 可以有空格,只使用 .+?:

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