我想检查变量“X”是否在以下模式中[a-zA-Z0-9]+:[0-9]+:[0-9]+
,我用以下命令检查它if [[ "${X}" =~ [a-zA-Z0-9]+:[0-9]+:[0-9]+ ]]
现在我想添加一个选项,该模式可以插入多个,在这种情况下,它将由 分隔,
。我想我可以做类似的事情[a-zA-Z0-9]+:[0-9]+:[0-9]+[,[a-zA-Z0-9]+:[0-9]+:[0-9]+]*
。我的问题是我是否可以做得更短?
答案1
您需要^[a-zA-Z0-9]+:[0-9]+:[0-9]+(,[a-zA-Z0-9]+:[0-9]+:[0-9]+)*$
, 在部分中使用括号而不是方括号(,...)*
,并将模式锁定到字符串的开头和结尾(否则足以匹配字符串的一部分)。
一种选择是保留正则表达式,但只需将重复部分存储在变量中:
p='[a-zA-Z0-9]+:[0-9]+:[0-9]+'
s='foo:12:34,bar:56:78'
[[ $s =~ ^$p(,$p)*$ ]] && echo yes
或者,在前面加一个逗号价值,只需将 RE 更改为(,[a-zA-Z0-9]+:[0-9]+:[0-9]+)+
:
q='^(,[a-zA-Z0-9]+:[0-9]+:[0-9]+)+$'
[[ ,$s =~ $q ]] && echo yes
但是,如果您要处理脚本中列表中的值,则迟早需要将其拆分为多个部分,因此您可以先拆分并分别测试每个部分:
s='adsf,bar:56:78'
p='^[a-zA-Z0-9]+:[0-9]+:[0-9]+$'
IFS=, read -a a <<< "$s"
for x in "${a[@]}"; do
if [[ $x =~ $p ]]; then
echo "$x is ok";
else
echo "$x is not ok";
fi
done