У меня нет опыта работы с 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.