Я разработал решение, которое мне понравилось, но обнаружил, что оно уже было опубликовано @Thefourthbird, поэтому я попробовал другой способ и придумал следующее:
/^(?=(?:-*[^-]-*){9}$)(?=(?:[^-]*-[^-]*){0,1}$).*/gm
Вы можете видеть, что это регулярное выражение содержит два положительные взгляды , оба начинаются в начале строки. Первый гарантирует, что строка содержит 9 не дефисов; второй требует, чтобы был не более одного дефиса.
demo
Демонстрация предоставляет подробное и подробное объяснение того, как работает это регулярное выражение, но мы также можем сделать это самодокументирование путем записи в режиме свободного пробега :
/
^ # match beginning of string
(?= # begin a positive lookahead
(?:-*[^-]-*){9} # match 9 strings, each with one char that is
# not a hyphen, possibly preceded and/or
# followed by hyphens
$ # match the end of a line
) # end positive lookahead
(?= # begin a positive lookahead
(?:[^-]*-[^-]*){0,1} # match 0 or 1 strings, each containing one hyphen,
# possibly preceded and/or followed by non-hyphens
$ # match the end of the string
) # end positive lookahead
.* # match 0+ characters (the entire string)
/gmx # global, multiline and free-spacing regex
# definition modes
При желании [^-]
можно заменить на [a-zA-Z0-9]
, \p{Alnum}
или что-то еще, в зависимости от требований .