带有 \d 的正则表达式在带有 [[ 的 if-else 语句中不起作用

ven*_*ter 7 command-line bash scripts regex

我写了以下脚本。稍后将在构建过程中使用它。我的目标是决定它是预发布版还是发布版。为了存档,我将 $release 与 RegEx 进行比较。如果我的 RegEx 匹配,则为预发布,否则为发布。

#/bin/bash
release="1.9.2-alpha1"
echo "$release"
if [[ "$release" =~ \d+\.\d+\.\d+[-]+.* ]];then
echo "Pre"
else
echo "Release"
fi
Run Code Online (Sandbox Code Playgroud)

但结果我总是得到以下结果:

~$ bash releasescript.sh
1.9.2-alpha1
Release
Run Code Online (Sandbox Code Playgroud)

版本:

Ubuntu 18.04.1 LTS
Run Code Online (Sandbox Code Playgroud)

我用这个编辑器来测试我的 RegEx。我被困了至少 6 小时,所以我非常感谢一些帮助。

Leo*_*Mew 12

\d\w就在不工作的POSIX正则表达式,你可以使用[[:digit:]],虽然

#/bin/bash
release="1.9.2-alpha1"
echo "$release"
LANG=C # This needed only if script will be used in locales where digits not 0-9
if [[ "$release" =~ ^[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+-+ ]];then
echo "Pre"
else
echo "Release"
fi
Run Code Online (Sandbox Code Playgroud)

我已经测试过这个脚本,它为给定的 $release 输出“Pre”

检查了您的正则表达式构建器,它仅适用于 perl 兼容和 javascript 正则表达式,而您需要 posix 或 posix 扩展。

通过@dessert

[0-9]是更短的替代品[[:digit:]]。由于要匹配字符串的开头,因此应该添加^,而.*在末尾则是多余的:^[0-9]+\.[0-9]+\.[0-9]+-+– 使用组可以进一步缩短为:^([0-9]+\.){2}[0-9]+-+

  • 打败我!另外,如果您使用了`shellcheck`,那么它会发出警告“SC1001:在这种情况下,此\d 将是常规的'd'。”,这非常有帮助。[其他答案](https://unix.stackexchange.com/questions/421460/bash-regex-and-https-regex101-com)。 (4认同)
  • [0-9] 等价于 [[:digit:]] 吗?我的印象是 POSIX 字符类匹配 Unicode 字符,因此可以很好地匹配不使用 0-9 的语言中的数字。 (2认同)