而循环BASH-Regex不匹配

时间:2016-09-24 00:27:26

标签: regex bash

为什么这个不可思议的简单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块并退出。我认为这是基本的,我为什么不抓住额外的数字或字符而感到茫然?

我很感激帮助。

3 个答案:

答案 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