Regex 如何在if-else中对类使用正则表达式和否定
我想检查一个变量是否通过regexRegex 如何在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
[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
谢谢,这很有意义。在
[]
中使用^
是否定的,我不想接受这些字符。不管怎样,谢谢你检查这个。你似乎没有抓住要点,通过否定正则表达式,你说你只接受那些字符。因此,如果字符串包含括号中没有的任何字符,则是失败的。你试过密码了吗?