Как преобразовать шаблон регулярного выражения, который использует Lookahead? - PullRequest
0 голосов
/ 04 апреля 2019

У меня проблемы с преобразованием этого регулярного выражения в то, что поддерживает Golang. Могу ли я получить помощь? Это от этот вопрос .

^(?=.{1,24}$)(?![_.])(?!.*[_.]{2})[a-zA-Z0-9._]+(?<![_.])$

Вот критерии:

  1. Содержит только буквенно-цифровые символы, подчеркивание и точка .
  2. Подчеркивание и точка не могут быть в конце или начало имени пользователя (например, _username / username_ / .username / username.).
  3. Подчеркивание и точка не могут быть рядом друг с другом (например, user_.name).
  4. Символ подчеркивания или точка нельзя использовать несколько раз подряд (например, user__name / user..name).

1 Ответ

3 голосов
/ 04 апреля 2019

У меня нет опыта работы с Go, так что, возможно, кто-то может найти лучшее решение.
Вот два варианта, которые я нашел:

1. Напишите регулярное выражение, которое охватывает все , кроме ограничения длины

Вы можете использовать что-то вроде этого:

^(?:[a-zA-Z0-9]+[._]?[a-zA-Z0-9]+)+$

Regex101 demo .

И вы можете использовать len для проверки длины строки. Вот полный пример:

func main() { 
    var re = regexp.MustCompile(`(?m)^(?:[a-zA-Z0-9]+[._]?[a-zA-Z0-9]+)+$`)
    var str = `username
user_name
user.name
user.name_123
username$$$
_username
username_
user_.name
user._name
user__name
user..name
VeryLongUserNameThatExceedsTheLimit
`
    for i, match := range re.FindAllString(str, -1) {
        if len(match) <= 24 {fmt.Println(match, "found at index", i)}
    }
}

Выход:

username found at index 0
user_name found at index 1
user.name found at index 2
user.name_123 found at index 3

Проверьте это онлайн .


2. Используйте сторонний движок

Я нашел этот движок на основе .NET , который должен поддерживать Lookarounds. Если предыдущее решение не работает для вас, вы можете посмотреть на это. Обратите внимание, что автор этого движка рекомендует по возможности использовать встроенный движок:

Вам, вероятно, будет лучше с двигателем RE2 от regexp пакет и должен использовать это только если вам нужно написать очень сложный шаблоны или требуют совместимости с .NET.

...