正则表达式匹配golang中不以www开头的字符串

时间:2018-10-04 13:48:43

标签: regex go traefik

我有以下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。 *

2 个答案:

答案 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开头,则必须 后跟某些内容。

Demo

澄清使这容易得多。方法是始终(可选)匹配www,然后始终将其放回替换中:

搜索:

www.

替换:

^http://(?:www\.)?(.*)\b$

Demo 2

答案 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)
        }
    }
}