Regex 正则表达式匹配golang中不以www开头的字符串
我有以下正则表达式Regex 正则表达式匹配golang中不以www开头的字符串,regex,go,traefik,Regex,Go,Traefik,我有以下正则表达式^http:\/\/(?!www\.)(.*)$ 预期行为: http://example.com - Match http://www.example.com - Does not match 看起来,golang不支持负前瞻。如何重写此正则表达式以在golang上工作 更新 我没有使用golang进行编码,我使用的是接受正则表达式(golang flavor)作为配置值的,所以基本上我有: regex = "^https://(.*)$" replacement = "h
^http:\/\/(?!www\.)(.*)$
预期行为:
http://example.com - Match
http://www.example.com - Does not match
看起来,golang
不支持负前瞻。如何重写此正则表达式以在golang
上工作
更新
我没有使用golang进行编码,我使用的是接受正则表达式(golang flavor)作为配置值的,所以基本上我有:
regex = "^https://(.*)$"
replacement = "https://www.$1"
我想要的是总是向URL添加www.,但是如果URL已经有了就不要添加,否则它会变成www.www.如果你真的想手动创建一个负前瞻,你需要在regexp中排除所有可能的
w
:
^https?://(([^w].+|w(|[^w].*)|ww(|[^w].+)|www.+)\.)?example\.com$
此regexp允许任何在example.com
之前带有点的单词,除非该单词只是www
。它允许任何不以w
开头的单词,或者,如果它以w
开头,它要么就是w
,要么后面跟着一个非w
和其他东西。如果它以两个w
开头,那么它必须正好是这一个,或者后跟一个非w
。如果它以www
开头,那么它后面必须跟一些东西
澄清使这变得容易得多。方法是始终(可选)匹配www.
,然后将其放回替换中始终:
搜索:
^http://(?:www\.)?(.*)\b$
替换:
http://www.$1
如果你真的想手动创建一个负前瞻,你需要排除regexp中所有可能的
w
:
^https?://(([^w].+|w(|[^w].*)|ww(|[^w].+)|www.+)\.)?example\.com$
此regexp允许任何在example.com
之前带有点的单词,除非该单词只是www
。它允许任何不以w
开头的单词,或者,如果它以w
开头,它要么就是w
,要么后面跟着一个非w
和其他东西。如果它以两个w
开头,那么它必须正好是这一个,或者后跟一个非w
。如果它以www
开头,那么它后面必须跟一些东西
澄清使这变得容易得多。方法是始终(可选)匹配www.
,然后将其放回替换中始终:
搜索:
^http://(?:www\.)?(.*)\b$
替换:
http://www.$1
Golang使用RE2正则表达式引擎,该引擎 由于您处理的是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)
}
}
}
Golang使用RE2正则表达式引擎,该引擎 由于您处理的是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)
}
}
}
我对golang一无所知这就是为什么这是一个评论,但是您不能在if语句中对
/^http:\/\/www./
进行匹配吗?如果它不匹配,请查找http://example.com
有关更多信息,请参考以下内容。我在使用re2作为正则表达式引擎时遇到了同样的问题,但没有Golang的完整表达能力(Terraform的regex()
函数)尝试在Terraform 0.13中使用变量验证,以确保用户不会传递以特定单词开头或结尾的字符串-例如,regex for不匹配字符串(不仅仅是字符)。我对golang一无所知,这就是为什么这是一条注释,但是您不能在if语句中对/^http:\/\/www./
进行匹配吗?如果它不匹配,请查找http://example.com
有关更多信息,请参考以下内容。我在使用re2作为正则表达式引擎时遇到了同样的问题,但没有Golang的完整表达能力(Terraform的regex()
函数)尝试在Terraform 0.13中使用变量验证,以确保用户不会传递以特定单词开头或结尾的字符串-例如,regex for不匹配字符串(不仅仅是字符)。实际上,我没有直接使用golang,所以我不能这样做-我需要在Traefik()中指定一个regex(golang风格)实际上我并没有直接使用golang,所以我不能这样做-我需要在Traefik()config中指定一个正则表达式(golang风格)。它可以部分工作。问题是,我需要捕获http://之后的任何域名,不包括“www”。此外,匹配的文本应该位于第一个捕获组($1)。你认为有可能实现吗?那就一直匹配www.
,然后无论如何都放回去怎么样?我会更新我的答案!谢谢DIt部分起作用。问题是,我需要捕获http://之后的任何域名,不包括“www”。此外,匹配的文本应该位于第一个捕获组($1)。你认为有可能实现吗?那就一直匹配www.
,然后无论如何都放回去怎么样?我会更新我的答案!谢谢D