Похоже, это должно быть сделано:
^[a-zA-Z0-9][-a-zA-Z0-9]{0,61}[a-zA-Z0-9]$
Соответствует любому буквенно-цифровому символу, затем соответствует до 61 буквенно-цифровому символу (включая дефисы), а затем соответствует любому одному буквенно-цифровому символу Минимальная длина строки - 2, максимальная - 63. Это не работает с Unicode. Если вам нужно, чтобы он работал с Unicode, вам нужно добавить различные классы символов вместо a-zA-Z0-9
, но принцип будет таким же.
Я считаю, что правильное выражение grep
, которое будет работать с Unicode:
^[[:alnum:]][-[:alnum:]]{0,61}[[:alnum:]]$
Пример использования:
echo 123-abc-098-xyz | grep -E '^[[:alnum:]][-[:alnum:]]{0,61}[[:alnum:]]$'
result=$(grep -E '^[[:alnum:]][-[:alnum:]]{0,61}[[:alnum:]]$' <<< "this-will-work"); echo $result;
echo "***_this_will_not_match_***" | grep -E '^[[:alnum:]][-[:alnum:]]{0,61}[[:alnum:]]$'