if语句中的Bash regexp不起作用

时间:2016-09-02 09:33:12

标签: regex bash

我正在尝试在bash中使用正则表达式,但我无法理解为什么这个后续场景不起作用:

Regexp:

REGEXP="^(test\/)(([a-zA-Z]+)\-)+(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$"

字符串:

STRING="test/test-ods-1.10.1"

测试:

if [[ "$STRING" =~ $REGEXP ]]
then
       echo "match!"
else
       echo "don't match"
fi

通常在这种情况下,我应该收到“匹配”,但它总是返回“不匹配”。

1 个答案:

答案 0 :(得分:3)

bash regexp中未定义

\d。将它们替换为[0-9],它将起作用:

$ [[ "test/test-1.10.1" =~ ^(test\/)(([a-zA-Z]+)\-)+(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$ ]]; echo $?
1

$ [[ "test/test-1.10.1" =~ ^(test\/)(([a-zA-Z]+)\-)+(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$ ]]; echo $?
0

在POSIX中没有定义速记类,GNU扩展只根据regular-expressions.info带来一些,\w\W\s\S }。