Regex для сопоставления строк, которые не начинаются с www в golang - PullRequest
0 голосов
/ 04 октября 2018

У меня есть следующее RegEx ^http:\/\/(?!www\.)(.*)$

Ожидаемое поведение:

http://example.com - Match
http://www.example.com - Does not match

Похоже, golang не поддерживает отрицательный прогноз.Как я могу переписать этот RegEx для работы на golang?

ОБНОВЛЕНИЕ

Я не кодирую с помощью golang, я использую Traefik который принимает Regex (golang flavor) в качестве значения конфигурации, поэтому в основном у меня есть это:

regex = "^https://(.*)$"
replacement = "https://www.$1"

Я хочу всегда добавлять www. к URL, но НЕ , если URL уже есть, в противном случае он станет www.www. *

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

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)
        }
    }
}
0 голосов
/ 04 октября 2018

Если вы действительно хотите создать отрицательный прогноз вручную, вам необходимо исключить все возможные w в регулярном выражении:

^https?://(([^w].+|w(|[^w].*)|ww(|[^w].+)|www.+)\.)?example\.com$

Это регулярное выражение разрешает любое слово с точкой до example.com, если только это слово не является www.Он делает это, допуская любое слово, которое не начинается с w, или, если оно начинается с w, это либо просто w, либо за ним следует не w и другие вещи.Если он начинается с двух w, то это должно быть либо просто, либо за ним следует не w.Если он начинается с www, за ним должно * что-то .

Демонстрация

Уточнение делает это намного проще.Подход заключается в том, чтобы всегда (необязательно) сопоставлять www., а затем всегда возвращать его в замену:

Поиск:

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

Заменить:

http://www.$1

Демо 2

...