Git提交消息正则表达式构建求助:匹配规则与捕获问题
Git提交消息正则表达式解决方案
完全可以实现你要的Git提交消息格式校验与内容提取需求,下面是调整后的正则表达式以及细节说明:
最终正则表达式
^(?<type>feat|fix|docs|style|refactor|perf|test|chore)(?:\((?<scope>.+)\))?: (?<subject>.{3,50})(?:\n\n(?<body>(?:(?!\n\n(?:BREAKING CHANGE:|Refs:)).)+))?(?:\n\nBREAKING CHANGE: (?<breaking>.+))?(?:\n\nRefs: (?<footer>.+))?$
(注:如果需要支持多行匹配且保留正则注释式换行,可添加/ms修饰符——m开启多行模式,s让.匹配换行符)
关键调整说明
- 边界处理:用
(?!\n\n(?:BREAKING CHANGE:|Refs:))负向预查实现核心需求——<body>会匹配到BREAKING CHANGE:或Refs:段落前,若两者都不存在则匹配到消息末尾。 捕获优化 :把原正则的\(.+\)改为\((?<scope>.+)\),精准捕获括号内的范围内容,避免贪婪匹配导致的错误。- 整体锚定:用
^和$锚定整个提交消息,防止匹配片段内容;所有可选结构用非捕获组(?:...)包裹,确保仅捕获需要的命名字段。
匹配验证
针对你给出的三个合规示例,该正则能精准捕获对应字段:
- 仅含主体的提交:捕获
type=feat、scope=stuff、subject=add feature、body=Body text and stuff\nMultiline body - 带BREAKING CHANGE的提交:额外捕获
breaking=Some breaking thing - 带Refs的提交:额外捕获
footer=Closes issue #270
补充提示
如果需要限制<body>最少字符数,可把(.+)替换为(.{3,}),和你原需求里的“3个字符以上”要求对应。
内容的提问来源于stack exchange,提问作者Deeblock
相关产品推荐
相关产品推荐

