我有以下RegEx ^http:\/\/(?!www\.)(.*)$
预期行为:
http://example.com - Match
http://www.example.com - Does not match
看来golang
不支持否定超前。如何重写此RegEx以在golang
上运行?
更新
我不是使用golang进行编码,而是使用Traefik来接受正则表达式(golang风格)作为配置值,因此基本上我具有以下条件:
regex = "^https://(.*)$"
replacement = "https://www.$1"
我想要的是始终在URL中添加 www。,但是如果URL已经具有 NOT ,则为 www.www。 *
答案 0 :(得分:2)
如果您真的想手动创建负前瞻,则需要在正则表达式中排除所有可能的Plug-in "com.microsoft.tfs.client.common.ui" was unable to instantiate class
"com.microsoft.tfs.client.common.ui.views.TeamExplorerView".
:
w
此正则表达式允许^https?://(([^w].+|w(|[^w].*)|ww(|[^w].+)|www.+)\.)?example\.com$
之前带有点的任何单词,除非该单词只是example.com
。通过允许所有不以www
开头的单词来实现此目的,或者,如果它以w
开头,则可以是w
或后跟非w
和其他东西。如果以两个w
开头,那么它必须是正好等于或后面跟非w
。如果其以w
开头,则必须 后跟某些内容。
澄清使这容易得多。方法是始终(可选)匹配www
,然后始终将其放回替换中:
搜索:
www.
替换:
^http://(?:www\.)?(.*)\b$
答案 1 :(得分:0)
Golang使用RE2正则表达式引擎doesn't support look arounds of any kind。
由于您正在处理URL,因此只需解析它们并检查主机部分:
package main
import (
"net/url"
"strings"
"testing"
)
func Match(s string) bool {
u, err := url.Parse(s)
switch {
case err != nil:
return false
case u.Scheme != "http":
return false
case u.User != nil:
return false
}
return !strings.HasPrefix(u.Host, "www.")
}
func TestMatch(t *testing.T) {
testCases := []struct {
URL string
Want bool
}{
{"http://example.com", true},
{"http://wwwexample.com", true},
{"http://www.example.com", false},
{"http://user@example.com", false},
{"http://user@www.example.com", false},
{"www.example.com", false},
{"example.com", false},
}
for _, tc := range testCases {
if m := Match(tc.URL); m != tc.Want {
t.Errorf("Match(%q) = %v; want %v", tc.URL, m, tc.Want)
}
}
}