【发布时间】:2020-10-05 12:46:20
【问题描述】:
我正在尝试实现一个 Git 挂钩,它将检查提交消息是否符合提交模板。为此,我想到了使用正则表达式(这似乎很明显)。规则如下:
- 标题必须包含一个或多个与提交性质相关的标签。每个标签都被“[ ]”包围,并且有一组特定的标签。
- 标题不得超过 72 个字符。
- 标题必须至少是一个单词(不是单个字符)。
- 如果包含邮件正文,则必须用空行将标题与标题隔开(这意味着要跳两行)。
- 邮件正文(如果包含)必须超过一个字符。
有了这些规则,我想出了以下正则表达式:(?=(?:\[(?:feat|fix|style)\])+\s\w{2,}).{8,72}(?(?=.*\n{2})\n{2}\w{2,})。当我在RegExr 中对其进行测试时,正则表达式可以正常工作,但是当我使用 grep 对其进行测试时,它无法按预期工作(我只是在我的终端中使用示例文件对其进行了测试)。
这将是带有 grep 的命令行指令:$ grep -P "(?=(?:\[(?:feat|fix|style)\])+\s\w{2,}).{8,72}(?(?=.*\n{2})\n{2}\w{2,})" holas.txt。其中文件“holas.txt”仅包含以下内容:[feat] Hola\n\nHola。运行此命令只返回一个与第一行 ([feat] Hola) 的匹配,而不是与消息正文中的文本匹配,该文本应与 正则表达式的条件部分匹配。如果我只是删除正文中的行,它也匹配第一行,但这不应该是这样,它不应该匹配(我已经用提到的在线工具测试了它)。
我也尝试过使用 pcregrep,但结果是一样的。
提前致谢。
【问题讨论】:
-
Grep 逐行读取输入。