使用 PCRE 正则表达式与 Grep 进行条件匹配未按预期匹配条件部分

Conditional matching with Grep using PCRE regex not matching conditional part as expected

我正在尝试实现一个 Git 挂钩 ,它将检查提交消息是否符合提交模板。为此,我想到了使用正则表达式(这似乎很明显)。规则如下:

  1. 标题必须包含一个或多个与提交性质相关的标签。每个标签都被“[]”包围,并且有一组特定的标签。
  2. 标题必须在 72 个字符以内。
  3. 标题必须至少是一个单词(而不是单个字符)。
  4. 消息的 body(如果包含)必须与标题用空行分隔(这意味着跳两行)。
  5. 消息的 body(如果包含)必须超过一个字符。

根据这些规则,我想出了以下正则表达式:(?=(?:\[(?: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。 运行 此命令 returns 仅匹配第一行 ([feat] Hola) 而不是消息 body 中的文本它应该与正则表达式 的 条件部分匹配。如果我只是删除 body 中的行它也匹配第一行,但这不应该是这样的,它不应该匹配(我已经用提到的在线工具测试过了)。

我也试过使用 pcregrep 但结果是一样的。

提前致谢。

找到解决方案!如果您使用 -z 标志,grep 会将文件解释为只有一行(它将 \n 替换为 null 字符)。这意味着正则表达式将应用于整条大行,而不是单独应用于每一行。

如此简单...我应该更好地阅读文档。