首页 > 解决方案 > 正则表达式从 git log 中多次匹配任何内容

问题描述

我想将 git log 消息分成几部分,这样我就可以访问每个提交并将其哈希和消息分开。

这是 git log 命令:

git log --pretty=short --abbrev-commit -n 2 HEAD

这是一个示例日志:

commit bfb9bac
Author: XXXXX XXXXXXXX <xxx.xxxxx@xxxxx.xxx>

    Something awesome happened here

commit a4fad44
Author: XXXXX XXXXXXXX <xxx.xxxxx@xxxxx.xxx>

    Ooh, more awesomeness
    So many lines

到目前为止我所尝试的:

([a-f0-9]{7})\n(?:Author.+\n\n)([\s\S]+)(?=\ncommit)

这里是 RegExr 的链接:https ://regexr.com/4d523

最后它应该是这样的:

const result = commits.match(regex)

result[0][0] // bfb9bac
result[0][1] // Something awesome happened here

result[1][0] // a4fad44
result[1][1] // Ooh, more awesomeness\n    So many lines

也可以分两步进行;首先拆分提交,然后拆分哈希和消息。

标签: javascriptregex

解决方案


您可以使用此正则表达式匹配每个提交日志并捕获 group1 中的 sha1 和 group2 中的消息,

^commit\s+(\S+)\n^Author:[\w\W]+?^\s+((?:(?!commit)[\w\W])+)

正则表达式解释:

  • ^commitcommit- 从行首开始匹配
  • \s+(\S+)\n- 匹配一个或多个空格后跟 sha1 值,该值在 group1 中使用(\S+)后跟换行符捕获\n
  • ^Author:[\w\W]+?- 再次从行首开始匹配Author,后跟冒号,后跟任何字符,尽可能少一次或多次
  • ^\s+- 这与行首的一个或多个空格匹配,这是下一个正则表达式部分开始捕获消息的点
  • ((?:(?!commit)[\w\W])+)- 这个表达式(又名temped greedy token)捕获任何字符,包括使用换行符,[\w\W]但如果它看到commit并将整个匹配项放在 group2 中,则停止捕获

正则表达式演示

这是一个JS代码演示,

str = `commit bfb9bac
Author: XXXXX XXXXXXXX <xxx.xxxxx@xxxxx.xxx>

    Something awesome happened here

commit a4fad44
Author: XXXXX XXXXXXXX <xxx.xxxxx@xxxxx.xxx>

    Ooh, more awesomeness
    So many lines`;

reg = new RegExp(/^commit\s+(\S+)\n^Author:[\w\W]+?^\s+((?:(?!commit)[\w\W])+)/mg);
while(null != (m=reg.exec(str))) {
   console.log("SHA1: " + m[1] + ", Message: " + m[2]);
}


推荐阅读