用于按指定顺序匹配git分支前缀的正则表达式

时间:2018-02-21 13:39:01

标签: regex

我正在尝试编写一个git钩子,它不允许用户将他的提交推送到不遵循我们的分支前缀规则的分支。

因此,为了匹配分支名称,我需要编写一个正则表达式。 以下是表示分支前缀排序的示例列表:

  • - 实验
  • d - devops
  • b - 后端
  • f - 前端

因此,例如,我们有以下应匹配的分支名称:

分支名称可能在前缀之后有其他单词如下(例如-git-hooks,-api)。

每个分支名称必须至少包含一个前缀(例如 -ex )。

  1. <developer>-ex-d - 使用devit实现git hooks的开发人员实验分支
  2. ex-b-f - 具有后端和前端api实现的实验分支
  3. 不应该匹配的分支名称:

    1. <developer>-d-ex-f-b - 非法前缀订单
    2. exp-front-back - 非法前缀
    3. 对我来说,最难的部分是如何在没有重复的情况下以正确的顺序匹配前缀。

      提前感谢您的回答!

3 个答案:

答案 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
  • ^[-]*$exdb以外的其他人:f
  • 未跟随预期后缀之一-(?!(ex|d|b|f)(-|$))[^-]*

can be checked on regex101