git 分支命名的正则表达式
Regex for git branch naming
我正在寻找一个正则表达式来执行有效的 git 分支命名约定。
规则是
- 分支名称只能是
main
、master
、development
- 分支名称可以以
features
、tests
、bugfix
、hotfix
开头;后跟 /
描述、数字、-
、_
( 或嵌套,但最多允许 2)
- 一个分支名称可以以
release/
开头,然后是版本号,它可以有beta
、alpha
或rc
标签,带或不带数字。
以下是几个有效名称的示例
main
bugfix/user-list
bugfix/user_list
bugfix/123
bugfix/123/account-update
bugfix/123/account_update
bugfix/User_crud/account-update
bugfix/User_crud/account_update
tests/api
tests/123
tests/123/hello
release/1.0.1
release/1.0.1-beta1
release/1.0.1-beta
release/1.0.1-rc3
我写了这个正则表达式 (https://regex101.com/r/n0CAuM/1),但它并不匹配上面的所有示例
^(development|master|main|(((features|tests|bugfix|hotfix)\/(([0-9A-Za-z-_]+)|((\/[0-9A-Za-z-_]+)))|release\/(?:(\d+)\.)?(?:(\d+)\.)?(\d+)?(-(alpha|beta|rc)[0-9]))))
另请注意,我将在 bash 脚本中使用正则表达式,该脚本仅支持 POSIX 正则表达式引擎 .
您可以将所有 3 个部分的交替放在模式的各自部分。
对于分组,您可以使用捕获组代替非捕获组,对于数字使用 [0-9]
而不是 \d
。
如果最多1-2个部分,可以使用量词{1,2}
您可以将模式写为:
^(main|development|master|(features|tests|(bug|hot)fix)(\/[a-zA-Z0-9]+([-_][a-zA-Z0-9]+)*){1,2}|release\/[0-9]+(\.[0-9]+)*(-(alpha|beta|rc)[0-9]*)?)$
^
字符串开头
(
开始外部分组以匹配 3 个允许模式中的 1 个
main|development|master
单个命名替代项中的匹配项 1
|
或
(features|tests|(bug|hot)fix)(\/[a-zA-Z0-9]+([-_][a-zA-Z0-9]+)*){1,2}
匹配功能的变体,测试并修复以下 /
而不是 -
或 _
并重复该部分 1 或 2 次
|
或
release\/[0-9]+(\.[0-9]+)*(-(alpha|beta|rc)[0-9]*)?
将发布分支的变体与可选的 alpha、beta 或 rc 匹配
)
关闭外分组
$
字符串结束
看到一个regex demo and a Bash demo.
例子
array=(development main bugfix/user-list bugfix/user_list bugfix/123 bugfix/123/account-update bugfix/123/account_update bugfix/User_crud/account-update bugfix/User_crud/account_update tests/api tests/123 tests/123/hello release/1.0.1 release/1.0.1-beta1 release/1.0.1-beta release/1.0.1-rc3 bugfix/ bugfix/- bugfix/_ bugfix/-name bugfix/_name bugfix/-/name bugfix/-/- bugfix/-/_ release/v1.0.1)
for i in "${array[@]}"
do
if [[ "$i" =~ ^(main|development|master|(features|tests|(bug|hot)fix)(/[a-zA-Z0-9]+([-_][a-zA-Z0-9]+)*){1,2}|release/[0-9]+(\.[0-9]+)*(-(alpha|beta|rc)[0-9]*)?)$ ]]; then
echo "Match: "$i
else
echo "No match: "$i
fi
done
输出
Match: development
Match: main
Match: bugfix/user-list
Match: bugfix/user_list
Match: bugfix/123
Match: bugfix/123/account-update
Match: bugfix/123/account_update
Match: bugfix/User_crud/account-update
Match: bugfix/User_crud/account_update
Match: tests/api
Match: tests/123
Match: tests/123/hello
Match: release/1.0.1
Match: release/1.0.1-beta1
Match: release/1.0.1-beta
Match: release/1.0.1-rc3
No match: bugfix/
No match: bugfix/-
No match: bugfix/_
No match: bugfix/-name
No match: bugfix/_name
No match: bugfix/-/name
No match: bugfix/-/-
No match: bugfix/-/_
No match: release/v1.0.1
我正在寻找一个正则表达式来执行有效的 git 分支命名约定。
规则是
- 分支名称只能是
main
、master
、development
- 分支名称可以以
features
、tests
、bugfix
、hotfix
开头;后跟/
描述、数字、-
、_
( 或嵌套,但最多允许 2) - 一个分支名称可以以
release/
开头,然后是版本号,它可以有beta
、alpha
或rc
标签,带或不带数字。
以下是几个有效名称的示例
main
bugfix/user-list
bugfix/user_list
bugfix/123
bugfix/123/account-update
bugfix/123/account_update
bugfix/User_crud/account-update
bugfix/User_crud/account_update
tests/api
tests/123
tests/123/hello
release/1.0.1
release/1.0.1-beta1
release/1.0.1-beta
release/1.0.1-rc3
我写了这个正则表达式 (https://regex101.com/r/n0CAuM/1),但它并不匹配上面的所有示例
^(development|master|main|(((features|tests|bugfix|hotfix)\/(([0-9A-Za-z-_]+)|((\/[0-9A-Za-z-_]+)))|release\/(?:(\d+)\.)?(?:(\d+)\.)?(\d+)?(-(alpha|beta|rc)[0-9]))))
另请注意,我将在 bash 脚本中使用正则表达式,该脚本仅支持 POSIX 正则表达式引擎 .
您可以将所有 3 个部分的交替放在模式的各自部分。
对于分组,您可以使用捕获组代替非捕获组,对于数字使用 [0-9]
而不是 \d
。
如果最多1-2个部分,可以使用量词{1,2}
您可以将模式写为:
^(main|development|master|(features|tests|(bug|hot)fix)(\/[a-zA-Z0-9]+([-_][a-zA-Z0-9]+)*){1,2}|release\/[0-9]+(\.[0-9]+)*(-(alpha|beta|rc)[0-9]*)?)$
^
字符串开头(
开始外部分组以匹配 3 个允许模式中的 1 个main|development|master
单个命名替代项中的匹配项 1|
或(features|tests|(bug|hot)fix)(\/[a-zA-Z0-9]+([-_][a-zA-Z0-9]+)*){1,2}
匹配功能的变体,测试并修复以下/
而不是-
或_
并重复该部分 1 或 2 次|
或release\/[0-9]+(\.[0-9]+)*(-(alpha|beta|rc)[0-9]*)?
将发布分支的变体与可选的 alpha、beta 或 rc 匹配
)
关闭外分组$
字符串结束
看到一个regex demo and a Bash demo.
例子
array=(development main bugfix/user-list bugfix/user_list bugfix/123 bugfix/123/account-update bugfix/123/account_update bugfix/User_crud/account-update bugfix/User_crud/account_update tests/api tests/123 tests/123/hello release/1.0.1 release/1.0.1-beta1 release/1.0.1-beta release/1.0.1-rc3 bugfix/ bugfix/- bugfix/_ bugfix/-name bugfix/_name bugfix/-/name bugfix/-/- bugfix/-/_ release/v1.0.1)
for i in "${array[@]}"
do
if [[ "$i" =~ ^(main|development|master|(features|tests|(bug|hot)fix)(/[a-zA-Z0-9]+([-_][a-zA-Z0-9]+)*){1,2}|release/[0-9]+(\.[0-9]+)*(-(alpha|beta|rc)[0-9]*)?)$ ]]; then
echo "Match: "$i
else
echo "No match: "$i
fi
done
输出
Match: development
Match: main
Match: bugfix/user-list
Match: bugfix/user_list
Match: bugfix/123
Match: bugfix/123/account-update
Match: bugfix/123/account_update
Match: bugfix/User_crud/account-update
Match: bugfix/User_crud/account_update
Match: tests/api
Match: tests/123
Match: tests/123/hello
Match: release/1.0.1
Match: release/1.0.1-beta1
Match: release/1.0.1-beta
Match: release/1.0.1-rc3
No match: bugfix/
No match: bugfix/-
No match: bugfix/_
No match: bugfix/-name
No match: bugfix/_name
No match: bugfix/-/name
No match: bugfix/-/-
No match: bugfix/-/_
No match: release/v1.0.1