Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式匹配golang中不以www开头的字符串_Regex_Go_Traefik - Fatal编程技术网

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