string - Bash:检查字符串是否包含特定的字母和逗号

标签 string bash

我正在尝试解析和验证 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 

最佳答案

我想这个问题还有一些暗示但没有强调的附加条件,例如:

  1. 数字可能不止一位。
  2. 每个 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/

相关文章:

c - 选择排序逻辑错误

mysql - 用于列出目录中文件的 Bash 脚本

在 R 中的一个 gsub() 或 chartr() 语句中替换多个字符串?

java - 在字符串中移动字符

bash - 在同一行中打印来自两个不同模式的匹配正则表达式值

linux - Bash 脚本 - 嵌套 $(..) 命令 - 无法正常工作

Bash for循环如何解决带空格的变量?

windows - 如何在 Windows 系统范围内指定 Maven 命令行参数?

c - 如何将字符串分成两部分?

Python:字符串中有多少相似的词?