首页 > 解决方案 > 正则表达式仅匹配无或一

问题描述

我正在尝试将以下 if 语句与正则表达式一起使用,但遇到了一些问题:

if ! [[ $myText =~ ^[A-Z0-9]{5},[[:space:]]?[\ A-Za-z0-9]+$ ]]; then
        echo "ERROR"
        continue
fi

目标是允许但不允许(2 个空格及以上)YHG6D,testYHG6D, testYHG6D, test

我想使用 ? 在 [[:space:]] 或 " " 之后会按照我的意愿将空间限制为无或一个,但它不起作用,因为我认为有 2 个空格也符合匹配标准。如果是这样,我如何从字面上限制匹配,以便如果逗号后没有空格或一个空格,它会运行代码,但如果逗号后有多个空格,则会引发错误?

而且,有人建议我"\"在表达式前面添加,[A-Za-z0-9]但不知道它的作用以及是否有必要。

标签: regex

解决方案


你的问题是\ 其中[\ A-Za-z0-9]+匹配一个空格。如果删除它,正则表达式会匹配逗号和单词之间的零个或一个空格:

^[A-Z0-9]{5},[[:space:]]?[A-Za-z0-9]+$

正如在https://regex101.com中测试的那样,这匹配YHG6D,testand YHG6D, test,但不匹配YHG6D, testor YHG6D, test

此外,您不需要continue在您的if声明中:

if ! [[ $myText =~ [A-Z0-9]{5},[[:space:]]?[A-Za-z0-9]+$ ]]; then
    echo "ERROR";
fi

以下是一些测试:

$ bash
$ myText="YHG6D,test"; if ! [[ $myText =~ [A-Z0-9]{5},[[:space:]]?[A-Za-z0-9]+$ ]]; then echo "ERROR"; fi
$ myText="YHG6D, test"; if ! [[ $myText =~ [A-Z0-9]{5},[[:space:]]?[A-Za-z0-9]+$ ]]; then echo "ERROR"; fi
$ myText="YHG6D,  test"; if ! [[ $myText =~ [A-Z0-9]{5},[[:space:]]?[A-Za-z0-9]+$ ]]; then echo "ERROR"; fi
ERROR
$

每行的$ 开头是 bash 提示符,因此从 复制命令myTest=...并将其粘贴到 bash 终端进行测试。


推荐阅读