如何使用egrep过滤版本号:拒绝大写字符及非法格式?
修复版本号合法性校验的egrep脚本问题
合法版本号格式
以下为合法的版本号示例:
11.22.33 11.22.33-alpha 11.22.33-beta 11.22.33-beta2
校验规则
- 拒绝包含大写字符的版本(如
11.22.33-ALPHA) - 拒绝存在多个连字符的版本(如
11.22.33-alpha-1) - 必须使用
egrep进行校验
原代码及问题
原Bash代码如下:
version=11.22.33-BETA result=$(echo $version | egrep "[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+(-[0-9a-z]+)?"); echo $result if [[ -z $result ]]; then echo "BAD version!!!" else echo "Good version." fi
问题:当version为11.22.33-BETA时,egrep会匹配到字符串中的11.22.33部分,导致result不为空,但该版本包含大写字符属于非法版本,脚本却错误输出Good version.(注:原描述中输出BAD version!!!存在笔误,实际原代码会输出合法判定)
修改方案
给正则表达式添加行首锚定^和行尾锚定$,确保整个字符串完全匹配规则,而非部分匹配。修改后的代码如下:
version=11.22.33-BETA result=$(echo "$version" | egrep "^[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+(-[0-9a-z]+)?$"); echo $result if [[ -z $result ]]; then echo "BAD version!!!" else echo "Good version." fi
修改说明
^:匹配字符串的起始位置$:匹配字符串的结束位置
添加锚定后,只有当版本号完全符合主版本号.次版本号.修订版本号(-小写字母数字后缀)?的完整格式时,才会被判定为合法,彻底避免了部分匹配导致的误判。
内容的提问来源于stack exchange,提问作者CodingFrog
相关产品推荐
相关产品推荐

