我正在尝试解析和验证 Bash 中以逗号分隔的字符串。预期的输入是:X4,Y1,Z5
条件:该字符串应该只有 X、Y 或 Z 字母,后跟任意数字。该字符串不应包含逗号以外的任何特殊字符。请提出建议。
X4,Y1,Z5(这个没问题)
Z2,y6,X1(这没问题)
X3Y6,Z8(这个不行)
A1,B2,X8(这不行)
N1P8*(这不行)
我尝试了以下方法,但没有按预期工作。
if [[ ! $str =~ ['!@#$%^&*()_+'] ]] && [[ $str =~ [XYZxyz] ]]; then
echo "OK"
else
echo "Not OK"
fi
最佳答案
我想这个问题还有一些暗示但没有强调的附加条件,例如:
- 数字可能不止一位。
- 每个
X,Y,Z
字母都应该只使用一次。
考虑到这一点,我认为这段代码可以做到:
if [[ "$1" =~ ^[XxYyZz][0-9]+(,[XxYyZz][0-9]+){2}$ ]] &&
[[ "$1" =~ .*[Xx].* ]] &&
[[ "$1" =~ .*[Yy].* ]] &&
[[ "$1" =~ .*[Zz].* ]]
then
echo OK
else
echo Not OK
fi
测试用例:
#!/usr/bin/env bash
check() {
[[ "$1" =~ ^[XxYyZz][0-9]+(,[XxYyZz][0-9]+){2}$ ]] &&
[[ "$1" =~ .*[Xx].* ]] &&
[[ "$1" =~ .*[Yy].* ]] &&
[[ "$1" =~ .*[Zz].* ]]
}
test_check() {
# code - expected exit code
# value - string to test
while read code value; do
check "$value"
if [[ $? == $code ]]; then
echo -e "\e[1;32mPassed:\e[0m $value"
else
echo -e "\e[1;31mFailed:\e[0m $value"
fi
done
}
test_check <<EOF
0 x1,y2,z3
0 X1,Y2,Z3
1 x,y,z
1 1,2,3
1 1x,2y,3z
0 z1,x2,y3
1 a1,b2,c3
1 x1
1 x1,y2 z1
1 x1,x2
1 x1;y2;z3
1 x1,y2
1 x1,y2,y3
0 x100,Y500,z0
0 x011,y015,z0
1 x1,x2,y3,z4
1 x1,y1,z1 .
EOF
附言
如果任何 X,Y,Z
可能在字符串中出现不止一次或根本没有出现,则 [[ "$str"=~ ^[XxYyZz][0-9 ]+(,[XxYyZz][0-9]+)*$ ]]
应该可以。我在此处添加 +
以便数字在字母后出现一次或多次,并引用 "$str"
以防万一其中有空格(或者,准确地说,$IFS
变量中的任何字符)。
关于string - Bash:检查字符串是否包含特定的字母和逗号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73173270/