Ограничить количество символов с помощью регулярных выражений - PullRequest
0 голосов
/ 31 января 2019

У меня есть ниже read, который будет принимать имя пользователя в виде first.last.Это обрабатывается регулярным выражением ниже.Как я могу ограничить максимальное количество символов до 16?

Я пытался добавить ^[a-zA-Z]+\.[a-zA-Z]+{,16}$, но при тестировании позволил мне создать пароль> 16 символов

read -p "Enter a Username (firstname.lastname): " username
until [[ "${username}" =~ ^[a-zA-Z]+\.[a-zA-Z]+$ ]];
do
        read -p "Incorrect format, retry Username: " username
done

Результатом будет ограничение в 16 символов для read для имени пользователя.

Редактировать

Мне удалось заставить его работать без-regex решение, как я изначально хотел, см. ниже:

read -p "Enter a Username (first.last): " username

until [[ "${username}" =~ ^[a-zA-Z]+\.[a-zA-Z]+$ ]] && (( 
"${#username}" < 16 )); do
    read -p "Maximum of 16 characters, try again: " username
done

Выходы:

Хорошо:

bash -x userInt.sh
+ read -p 'Enter a Username (first.last): ' username
Enter a Username (first.last): foo.bar
+ [[ foo.bar =~ ^[a-zA-Z]+\.[a-zA-Z]+$ ]]
+ ((  7 < 16  ))
+ read -sp 'Enter a Password (Minimum 8 characters): ' password

Плохо:

bash -x userInt.sh
+ read -p 'Enter a Username (first.last): ' username
Enter a Username (first.last): someones.reallylongname
+ [[ someones.reallylongname =~ ^[a-zA-Z]+\.[a-zA-Z]+$ ]]
+ ((  23 < 16  ))
+ read -p 'Maximum of 16 characters, try again: ' username

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Во-первых, ваши пользователи будут ненавидеть вас, если «неправильный формат» - это вся информация, которую вы им предоставляете.Во-вторых, вы спрашиваете много одного регулярного выражения.Да, вы могли бы сделать это с помощью регулярного выражения, но вам жаль, что парень поддерживает его позади вас.:)

Я предполагаю, что вы просто запрещаете всем не-альфа.Вы уверены, что не хотите автоматически преуменьшать это тоже?И, кроме того, это запретит расширенные символы, а firstname.lastname - это очень евроцентричный образ мышления ...

declare -l username # forces values to lowercase
msg="Please use only letters with a single dot separator, and limit the total to 16 characters."
while read -p "Enter a Username (firstname.lastname): " username
do case "$username" in                                # check for
   # too long  | invalid chars | multidots
   ?????????????????*|*[^a-z.]*|*.*.*) echo "$msg" ;; # add A-Z if not downcasing
   *.*) break;;                                       # this is the format we want
   *) echo "$msg" ;;                                  # a catch-all in case we missed anything else
   esac
done

Регулярные выражения более мощные, чем глобальные, но это более читабельно для меня.YMMV.

0 голосов
/ 31 января 2019

Вы не написали свой, если 16 символов должны быть ограничением для обоих или для каждого имени или фамилии.

Если вы хотите ограничение для каждых 16 символов, вы можете сделать это следующим образом:

^[a-zA-Z]{1,16}\.[a-zA-Z]{1,16}$

Если это будет общий лимит, вы можете сделать это следующим образом (исключая точку из числа):

^[a-zA-Z]{1,8}\.[a-zA-Z]{1,8}$

Первое редактирование: Я не включил код bash (основываясь на вашем вопросе):

read -p "Enter a first name (firstname.lastname): " username
until [[ "${username}" =~ ^[a-zA-Z]{1,8}\.[a-zA-Z]{1,8}$ ]];
do
        read -p "Incorrect format, retry Username: " username;
done

Это наложит ограничение в 8 символов на имя и фамилию.Как я предложил в комментарии, вы должны сделать статистику длины имени / фамилии и отрегулировать ограничения на основе этого.

...