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

cdmah0mi  于 2023-04-13  发布在  其他
关注(0)|答案(1)|浏览(101)

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

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

正则表达式本身可以工作,当在RegexChecker上检查时匹配“1.0.0”。但是,当我试图在bash脚本中 Package 相同的正则表达式时,我的代码进入“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

我试着用set -x运行调试器,但没有成功。有什么建议吗?

nwsw7zdq

nwsw7zdq1#

bash shell正则表达式是POSIX扩展的正则表达式,不支持\d用于数字,也不支持(?!...)用于负lookaheads
\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

相关问题