【问题标题】:Conditional matching with Grep using PCRE regex not matching conditional part as expected使用 PCRE 正则表达式与 Grep 进行条件匹配与预期的条件部分不匹配
【发布时间】:2020-10-05 12:46:20
【问题描述】:

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

  1. 标题必须包含一个或多个与提交性质相关的标签。每个标签都被“[ ]”包围,并且有一组特定的标签。
  2. 标题不得超过 72 个字符。
  3. 标题必须至少是一个单词(不是单个字符)。
  4. 如果包含邮件正文,则必须用空行将标题与标题隔开(这意味着要跳两行)。
  5. 邮件正文(如果包含)必须超过一个字符。

有了这些规则,我想出了以下正则表达式:(?=(?:\[(?: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 逐行读取输入。

标签: git grep pcre githooks


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    相关资源
    最近更新 更多