为什么这个不可思议的简单REGEX不匹配?!!?
#!/bin/bash
while true
do
read -r -p $'What is the JIRA Ticket associated with this work?' JIRA
#Use a regular expresion to verify that our reply stored in JIRA is only 4 digits, if not, loop and try again.
if [[ ! "$JIRA" =~ [0-9]{4} ]]
then
echo -en "The JIRA Ticket should only be 4 digits\nPlease try again."
continue
else
break 1
fi
done
出现提示时,如果您输入“ffffff”,它会捕获,但如果您输入的数字超过4位数“444444”或者甚至在其中输入一个字母“4444444fffff”它没有捕获任何内容,则会点击else
块并退出。我认为这是基本的,我为什么不抓住额外的数字或字符而感到茫然?
我很感激帮助。
答案 0 :(得分:3)
正则表达式是开放式的,这意味着它只需匹配左侧参数的子字符串,而不是整个事物。锚定正则表达式以强制它匹配整个字符串:
if [[ ! "$JIRA" =~ ^[0-9]{4}$ ]]
答案 1 :(得分:3)
您需要将等同测试更改为:
if [[ ! "$JIRA" =~ ^[0-9]{4}$ ]]
这可确保整个字符串只包含四位数字。 ^
表示字符串的开头,$
表示字符串的结尾。
答案 2 :(得分:0)
也许更简单的模式(==而非=〜)可以解决您的问题:
#!/bin/bash
while true
do
read -r -p $'What is the JIRA Ticket associated with this work?' JIRA
[[ $JIRA == [0-9][0-9][0-9][0-9] ]] && break 1
echo -en "The JIRA Ticket should only be 4 digits\nPlease try again."
done