我正在尝试编写一个git钩子,它不允许用户将他的提交推送到不遵循我们的分支前缀规则的分支。
因此,为了匹配分支名称,我需要编写一个正则表达式。 以下是表示分支前缀排序的示例列表:
因此,例如,我们有以下应匹配的分支名称:
分支名称可能在前缀之后有其他单词如下(例如-git-hooks,-api)。
每个分支名称必须至少包含一个前缀(例如 -ex )。
<developer>-ex-d
- 使用devit实现git hooks的开发人员实验分支ex-b-f
- 具有后端和前端api实现的实验分支不应该匹配的分支名称:
<developer>-d-ex-f-b
- 非法前缀订单exp-front-back
- 非法前缀对我来说,最难的部分是如何在没有重复的情况下以正确的顺序匹配前缀。
提前感谢您的回答!
答案 0 :(得分:1)
要么我没有正确理解你,要么这就是你想要的
/^([^-]+)?(-ex)?(-d)?(-b)?(-f)?(?!((-ex)|(-d)|(-b)|(-f)))(-.*)?$/
请参阅an older version of canvg以了解其有效
这将依次查找您的前缀,然后使用否定前瞻来强制执行重复,然后允许其他名称块。
实际上,有一个错误:这将禁止(例如)<developer>-ex-d-dev
,因为它认为存在重复-d
。我会在这里留下答案,万一其他人可以改进它。
答案 1 :(得分:0)
我无法使用正则表达式来回答这个问题,但是在python中它可以像这样完成(我知道这不是一个很好的答案,但它有效):
import re
def check_prefixes(string_to_check):
lst_prefixes = ['-ex-', '-d-', '-b-', '-f-']
# find position of all prefixes (-1 indicates prefix was not present and so can be skipped)
lst_positions = [string_to_check.find(prefix) for prefix in lst_prefixes if string.find(prefix) != -1]
string_correct = True
# if the prefixes aren't in the right order the string isn't correct
if sorted(lst_positions) != lst_positions:
string_correct = False
else:
# find all the prefixes
# the string needs to be adjusted so that re.findall actually finds all the prefixes and doesn't skip the even numbered ones or the first/last
string_to_check= '-' + string_to_check.split('>-')[-1].replace('-', '--') + '-'
all_prefixes = re.findall('(-.*?-)', string_to_check)
# check if all the prefixes are legal
for prefix in all_prefixes:
if prefix not in lst_prefixes:
string_correct = False
break
return string_correct
to_check = ['<developer>-ex-d',
'ex-b-f',
'<developer>-d-ex-f-b',
'exp-front-back']
for string_to_check in to_check:
print '{} = {}'.format(string_to_check, check_prefixes(string_to_check))
也许你可以用你最熟悉的编码语言来使它工作。
答案 2 :(得分:0)
使用单个正则表达式可能更容易匹配不需要的分支:
extensionsList
^[-]*$
,ex
,d
,b
以外的其他人:f
-(?!(ex|d|b|f)(-|$))[^-]*