为何指定正则表达式在Regex101有效却无法在Bash脚本中工作?
Bash分支名正则匹配问题解决
问题场景
正则表达式 ^(feature|bugfix|refactor|release|hotfix|other)\/[a-z0-9._-]+\/[a-z0-9._-]+$ 在测试工具中能匹配分支名 feature/XXXX-23/xxxx-xxxx,但在以下Bash脚本中无法匹配该字符串,仅能匹配全小写分支名如 feature/no-ref/xx-xxxx:
local_branch="$(git rev-parse --abbrev-ref HEAD)" valid_branch_regex="^(feature|bugfix|refactor|release|hotfix|other)\/[a-z0-9._-]+\/[a-z0-9._-]+$" message="\x1B[01;91m Some message. \x1B[0m" if [[ ! $local_branch =~ $valid_branch_regex ]] then echo "$message" exit 1 else echo "\x1B[01;92m Your branch name is okay \x1B[0m" fi
问题原因
Bash 的 [[ ... =~ ... ]] 正则匹配默认区分大小写,而 feature/XXXX-23/xxxx-xxxx 中包含大写字母 X,但正则里的 [a-z0-9._-] 仅匹配小写字母,导致匹配失败。测试工具中可能开启了不区分大小写模式,所以能正常匹配。
解决方法
方法1:修改正则支持大小写字母
把正则里的 [a-z0-9._-] 替换为 [a-zA-Z0-9._-],同时兼容大小写:
valid_branch_regex="^(feature|bugfix|refactor|release|hotfix|other)\/[a-zA-Z0-9._-]+\/[a-zA-Z0-9._-]+$"
方法2:开启Bash不区分大小写匹配
通过 shopt -s nocasematch 全局开启不区分大小写匹配(如需恢复默认区分大小写,可执行 shopt -u nocasematch):
shopt -s nocasematch local_branch="$(git rev-parse --abbrev-ref HEAD)" valid_branch_regex="^(feature|bugfix|refactor|release|hotfix|other)\/[a-z0-9._-]+\/[a-z0-9._-]+$" message="\x1B[01;91m Some message. \x1B[0m" if [[ ! $local_branch =~ $valid_branch_regex ]] then echo "$message" exit 1 else echo "\x1B[01;92m Your branch name is okay \x1B[0m" fi
内容的提问来源于stack exchange,提问作者Thabo
相关产品推荐
相关产品推荐

