Bash 检查 reg 表达式一次或多次

Bash 检查 reg 表达式一次或多次

我想检查变量“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

相关内容