正则表达式匹配但脚本意外失败?

m00*_*0s3 2 regex bash

我有这个正则表达式来匹配版本号:

^[1-9]\d{0,1}\.(?!0\d)\d{1,3}\.(?!0\d)\d{1,4}$
Run Code Online (Sandbox Code Playgroud)

RegexChecker上检查时,正则表达式本身可以工作并匹配“1.0.0” 但是,当我尝试将相同的正则表达式包装在 bash 脚本中时,我的代码进入“else”状态。我不明白为什么?

#!/bin/bash
VERSION='1.0.0'
MATCH_PATTERN='^[1-9]\d{0,1}\.(?!0\d)\d{1,3}\.(?!0\d)\d{1,4}$'
if [[ $VERSION =~ $MATCH_PATTERN ]]; then
  :
else
  echo "Version number format is wrong."
  exit 1
fi
Run Code Online (Sandbox Code Playgroud)

我尝试使用调试器运行set -x但没有运气。有什么建议 ?

小智 5

bash shell 正则表达式是POSIX 扩展正则表达式,不支持\d数字或(?!...)负向先行

\d可以替换为[0-9][:digits:]

(?!0\d)可以替换为 0 或不以 0 开头的数字(0|[1-9][0-9]{0,2})

该模式^[1-9][0-9]{0,1}\.(0|[1-9][0-9]{0,2})\.(0|[1-9][0-9]{0,3})$应与指定的 PCRE 表达式匹配。

#!/bin/bash
VERSION='1.0.0'
MATCH_PATTERN='^[1-9][0-9]{0,1}\.(0|[1-9][0-9]{0,2})\.(0|[1-9][0-9]{0,3})$'
if [[ $VERSION =~ $MATCH_PATTERN ]]; then
  :
else
  echo "Version number format is wrong."
  echo 1
fi
Run Code Online (Sandbox Code Playgroud)