使用PCRE正则表达式的Grep条件匹配与预期的条件部分不匹配



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

  1. 标题必须包含一个或多个与提交性质相关的标记。这些标签中的每一个都被";[]";并且有一组特定的
  2. 标题必须少于72个字符
  3. 标题必须至少包含一个单词(而不是一个字符(
  4. 消息的正文(如果包含(必须与标题用空行分隔(这意味着两行跳转(
  5. 消息的正文(如果包含(必须多于一个字符

有了这些规则,我得出了以下正则表达式:(?=(?:[(?:feat|fix|style)])+sw{2,}).{8,72}(?(?=.*n{2})n{2}w{2,})。当我在RegExr中测试regex时,它工作得很好,但当我用grep测试它时,它并不像预期的那样工作(我只是在我的终端中用一个示例文件测试它(。

这将是带有grep:$ grep -P "(?=(?:[(?:feat|fix|style)])+sw{2,}).{8,72}(?(?=.*n{2})n{2}w{2,})" holas.txt的命令行指令。其中文件";"holas.txt";只包含以下内容:[fatte]Hola\n\nHola。运行此命令只返回与第一行([filet]Hola(的一个匹配项,而不返回应与正则表达式的条件部分匹配的消息正文中的文本。如果我只是删除正文中的一行,它也与第一行匹配,但这不应该是那样的,它不应该匹配(我已经用提到的在线工具测试过了(。

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

提前谢谢。

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

这么简单。。。我本应该更好地阅读文档的。

最新更新