【问题标题】:Bash regex is not working for git branch namesBash 正则表达式不适用于 git 分支名称
【发布时间】:2020-04-16 06:39:05
【问题描述】:

我有以下脚本:

valid_branch_regex="^(feature|bugfix|improvement|library|prerelease|release|hotfix)\/(?=[A-Z]{1,}-[0-9]{1,}).{3,9}\/[a-z0-9._-]+$"
local_branch="$(git rev-parse --abbrev-ref HEAD)"
[[ $local_branch =~ $valid_branch_regex ]] && echo matched

如果local_branchfeature/III-111/some-name,为什么它不打印“匹配”?

【问题讨论】:

  • 请为您的git rev-parse --abbrev-ref HEAD 命令显示示例输出。
  • @lurker feature/III-111/some-name
  • @VladislavPokosenko 如果您删除 ?=.{3,9},则您的正则表达式匹配。你不必同时转义/,但你应该双引号你的$local_branch变量(测试的左侧)。
  • 所以您想检查III-111 部分的长度只能是3 到9 个字符并匹配[A-Z]+-[0-9]+ 模式吗?
  • @WiktorStribiżew,是的。 [A-Z][0-9] 最小长度为 1。

标签: regex bash sh


【解决方案1】:

您正在尝试使用积极的前瞻 (?=)。这在 bash 中不受支持。 Bash 仅支持扩展的正则表达式 (ERE)。 Lookaheads 是作为 PCRE(Perl 兼容正则表达式)的一部分引入的,Bash 本身不支持。

您可以通过在代码末尾添加echo $? 来检查退出状态,这将输出 2 表示正则表达式在语法上不正确。

参考: https://en.wikipedia.org/wiki/Regular_expression#POSIX_extended https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Conditional-Constructs

【讨论】:

  • 同时添加 typeset -p BASH_REMATCH 有助于极大地调试 Bash 中的正则表达式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
  • 2015-08-12
  • 2011-04-16
  • 1970-01-01
  • 2013-09-08
相关资源
最近更新 更多