Прежде всего, кажется, что вы можете реорганизовать шаблон для использования в 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+ слова, кроме _
$
- конец строки