javascript - 正则表达式从 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
也可以分两步进行;首先拆分提交,然后拆分哈希和消息。
解决方案
您可以使用此正则表达式匹配每个提交日志并捕获 group1 中的 sha1 和 group2 中的消息,
^commit\s+(\S+)\n^Author:[\w\W]+?^\s+((?:(?!commit)[\w\W])+)
正则表达式解释:
^commit
commit
- 从行首开始匹配\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]);
}
推荐阅读
- reactjs - “找不到
我有一个 takeLatest() 传奇函数,它调用一个名为 postDeliverySubmitSaga() 的传奇,我想将参数传递给它。
我这样定义我的函数:
export function* postDeliverySubmitSaga({
- javascript - 输入值未呈现到 React Hooks 中的另一个组件
- sql - 从 SQL 表中查找部分和完全重复
- php - 当它们共享相同的数组键时,如何阻止数组结果被合并?
- python - 如何发送带有请求的 HTTP/2 伪标头?
- java - A Star 算法中如何标记最终的最短路径?
- git - 是否有 git 命令可以将当前状态描述为“branch/short_commit_hash”
- php - 将查询数据插入到相同的 sql 查询中
- python - 右移一个numpy数组会改变dtype?
- swift - 如何在 Swift 中将像素尺寸转换为 CG 尺寸?