Regex 如何在if-else中对类使用正则表达式和否定

Regex 如何在if-else中对类使用正则表达式和否定,regex,bash,Regex,Bash,我想检查一个变量是否通过regex[a-z\-]+,我尝试的是 NAME_A="something" NAME_B="Something_Wrong" VALID_CHARACTERS="[a-z\-]+" if [[ ! $NAME_A =~ $VALID_CHARACTERS ]]; then echo "NAME_A failed"; exit 1 else echo "NAME_A passed" fi if [[ ! $NAME_B =~ $VALID_C

我想检查一个变量是否通过regex
[a-z\-]+
,我尝试的是

NAME_A="something"
NAME_B="Something_Wrong"
VALID_CHARACTERS="[a-z\-]+"

if [[ ! $NAME_A =~ $VALID_CHARACTERS ]]; then
    echo "NAME_A failed";
    exit 1
else 
    echo "NAME_A passed"
fi

if [[ ! $NAME_B =~ $VALID_CHARACTERS ]]; then
    echo "NAME_B failed";
    exit 1
else 
    echo "NAME_B passed"
fi
但if条件始终为真。
()

您需要添加开始(
^
)和结束锚(
$
),以分别指示要匹配的模式的开始和结束。如果没有这些,正则表达式模式
[a-z\-]+
将始终返回给定输入的匹配项,因为两个输入字符串中至少有一个小写字母字符

因此,将模式设置为:

VALID_CHARACTERS="^[a-z\-]+$"

您的正则表达式有误。将其更改为“^[a-z]+”即可

NAME_A="something"
NAME_B="Something_Wrong"
VALID_CHARACTERS="^[a-z]+"

if [[ ! $NAME_A =~ $VALID_CHARACTERS ]]; then
    echo "NAME_A failed";
    exit 1
else 
    echo "NAME_A passed"
fi

if [[ ! $NAME_B =~ $VALID_CHARACTERS ]]; then
    echo "NAME_B failed";
    exit 1
else 
    echo "NAME_B passed"
fi

你也可以回答你的问题,这就是对正则表达式的否定:

NAME_A="something"
NAME_B="Something_Wrong"
VALID_CHARACTERS="[^a-z-]"

if [[ $NAME_A =~ $VALID_CHARACTERS ]]; then
    echo "NAME_A failed";
    exit 1
else
    echo "NAME_A passed"
fi

if [[ $NAME_B =~ $VALID_CHARACTERS ]]; then
    echo "NAME_B failed";
    exit 1
else
    echo "NAME_B passed"
fi

通过使用扩展glob条件可以避免正则表达式,如下所示:

shopt -s extglob
isvalid() { [[ $1 == +([a-z-]) ]]; }
然后测试它,如下所示:

isvalid "something-valid" && echo "ok" || echo "no"
ok

isvalid "something" && echo "ok" || echo "no"
ok


isvalid "something_wrong" && echo "ok" || echo "no"
no

谢谢,这很有意义。在
[]
中使用
^
是否定的,我不想接受这些字符。不管怎样,谢谢你检查这个。你似乎没有抓住要点,通过否定正则表达式,你说你只接受那些字符。因此,如果字符串包含括号中没有的任何字符,则是失败的。你试过密码了吗?