编写可匹配字符串、#及数字的GitLab提交信息钩子正则
适配GitLab提交钩子的合规提交信息正则
原正则存在的问题
你之前编写的^(BUG|bug|Bug)\ |#\d+ 存在三处核心问题,导致无法匹配预期场景:
- 分支逻辑错误:正则中的
|会将匹配规则拆为两个独立分支,即「匹配开头的bug类字符串+空格」OR「匹配文本任意位置的#加数字」,完全不符合连续匹配的要求 - 数字位数无约束:仅用
\d+没有限制数字为5-6位,会误匹配3位、7位等不合规的数字 - 分隔场景覆盖不全:仅单独罗列了空格、#两种字符,没有考虑零分隔、#与空格组合的情况
符合要求的正则方案
根据列出的规则,给出兼容RE2语法(适配GitLab钩子运行环境)的正则,分两种常用校验场景:
- 场景1:要求提交信息完全匹配给定格式,不允许后续追加其他内容
^(BUG|bug|Bug)[#\s]*\d{5,6}$ - 场景2:要求提交信息开头符合格式,后续可追加业务描述(Git提交钩子的通用使用方式)
^(BUG|bug|Bug)[#\s]*\d{5,6}
逐段规则说明
^:强制从提交信息的最开头开始匹配,杜绝内容前置夹杂其他字符的情况(BUG|bug|Bug):精确匹配三种允许的开头大小写形式,不会误识别其他大小写组合(如bUg、bUG等)[#\s]*:匹配开头字符串与数字之间的所有允许分隔符,其中#匹配规则允许的井号,\s匹配所有空白字符(空格、制表符等),*表示允许该类分隔符出现0次或多次,可完整覆盖所有给定示例场景:- 无分隔拼接:
bug12345 - 单空格分隔:
bug 12345 - 井号直接拼接:
Bug#12345 - 井号加空格分隔:
BUG # 12345
- 无分隔拼接:
\d{5,6}:强制数字部分为5位或6位,精准过滤其他位数的不合规数字$:仅在全格式校验场景下使用,强制匹配到数字部分即结束,不允许后续出现其他内容
合规性校验说明
上述正则可完全匹配所有列出的示例输入,同时可拦截以下不合规场景:
- 开头大小写不符合要求的内容,如
bUg 12345 - 分隔部分夹杂其他字符的内容,如
bug 测试12345 - 数字位数不符合要求的内容,如
bug 1234(4位)、bug 1234567(7位)
内容的提问来源于stack exchange,提问作者Sameer Atharkar
相关产品推荐
相关产品推荐

