Предыдущий токен не поддается количественной оценке - PullRequest
4 голосов
/ 28 апреля 2020

У меня есть регулярное выражение имени пользователя:

/^(?=.{5,32}$)(?![1-9_])(?!.*_{2})\w+(?<!_)$/gm

О регулярном выражении:

  1. Первый символ - это буква.
  2. Вы не можете использовать 2 подчеркивания в строке.
  3. В конце не может быть подчеркивания.
  4. Допускаются символы [a-zA-Z0-9_] (\ w).
  5. от 5 до 32 символов

Я не могу использовать его в Go из-за оглядки вперед и назад.

Предыдущий токен не поддается количественной оценке

Вопрос:

Как смоделировать эти lookahead и lookbehind в Go Regexp, чтобы заставить его работать?

1 Ответ

3 голосов
/ 28 апреля 2020

Прежде всего, кажется, что вы можете реорганизовать шаблон для использования в JavaScript: /^(?=.{5,32}$)[^\W0-9_][^\W_]*(?:_[^\W_]+)*$/, см. Демонстрацию regex .

Теперь его легко конвертировать. до Go, с двумя отдельными проверками: 1) длина перемешивания может быть проверена без регулярного выражения, 2) общая проверка шаблона может быть выполнена с использованием потребляющей JS части регулярного выражения:

package main

import (
    "fmt"
    "regexp"
    "unicode/utf8"
)

func main() {
    s := "abc_123def"
    whole_cond := regexp.MustCompile(`^[^\W0-9_][^\W_]*(?:_[^\W_]+)*$`)
    pass_len := utf8.RuneCountInString(s)
    fmt.Println(whole_cond.MatchString(s) && pass_len >= 5 && pass_len <= 32)
}

См. Go демо .

Сведения о регулярном выражении

  • ^ - начало строки
  • [^\W0-9_] - любое слово char, кроме ASCII di git и _
  • [^\W_]* - 0+ слов символов, но _
  • (?:_[^\W_]+)* - ноль или более вхождений
    • _ - _ char
    • [^\W_]+ - 1+ слова, кроме _
  • $ - конец строки
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...