我想创建一个正则表达式来强制执行git提交消息。样式如下:
<type>(<scope>): <subject>
<body>
BREAKING CHANGE: <breaking>
Refs: <references>
字符串
须符合以下条件:
1.()是可选的。
1.可以与段落多行,并且应该仅匹配到BREAKING CHANGE/Refs之前。
1.是可选的。
问题是:3. BREAKING CHANGE和Refs是可选的,因此当且仅当这两者不存在时,body必须匹配到末尾。
我的当前正则表达式:
/
(?<type>feat|fix|docs|style|refactor|perf|test|chore) -> Type
(?<scope>\(.+\))?: (?<subject>.{3,50}) -> Scope and Subject
(?:(?:\n\n(?<body>[\w\W]{3,}))? -> Body (how to match until the end, or stop if it sees BREAKING CHANGE or Refs?)
(?:\n\nBREAKING CHANGE: (?<breaking> [\w\W]{3,}))?
(?:\n\nRefs: (?<footer> [\w\W]{3,}))?
/gm
型
这可能吗?我尝试使用命名捕获来提取提交消息的不同部分,同时测试其有效性。
下面是一些好的提交消息的例子:
feat(stuff): add feature
Body text and stuff
Multiline body
x
feat(stuff): add feature
Body text and stuff
Multiline body
BREAKING CHANGE: Some breaking thing
feat(stuff): add feature
Body text and stuff
Multiline body
Refs: Closes issue #270
的一种或多种
1条答案
按热度按时间0yycz8jy1#
我最终选择了以下代码,因为Gitlab不允许lookaheads/lookbehinds。这允许任意长的主体以及键:值页脚。
字符串
注意这个正则表达式是针对Gitlab compatible RE2的。
在这里测试:regex101.com/r/n7M4tw/1的