用于匹配具有前缀的目录的正则表达式模式

标签 regex git pre-commit-hook

我是正则表达式的新手,我不知道如何为我正在尝试做的这种模式设置正则表达式。

表达式应该在 Python 预提交脚本中,如果提交的文件匹配它,它将运行预提交 Hook 。

我的示例文件列表

vars/prod-region1/mysql.yml
vars/prod-region1/keys.yml
vars/prod-region1/test.yml
vars/stage-region2/mysql.yml
vars/stage-region2/keys.yml
vars/stage-region2/test.yml
vars/local/mysql.yml
vars/local/test.yml

我需要一个正则表达式模式来匹配属于以下目录模式的文件

  • vars/prod*/mysql.yml
  • vars/prod*/keys.yml
  • vars/stage*/mysql.yml
  • vars/stage*/keys.yml

我现在的努力是

vars/(prod*|stage*)/(mysql|keys).yml

这是严重错误的。任何帮助都会很棒。

最佳答案

您使用的 * 不正确。它是一个重复指示器,而不是一个多字符通配符;正则表达式语法中没有通用(可变长度)通配符。但是,有单字符通配符和准通配符。因此,例如,.* 匹配任何字符,零次或多次。 \S* 匹配零个或多个非空白字符。但是,在您的示例中,d* 连续匹配零个或多个 d。与 e* 类似。

您需要使用一些东西来匹配额外的字符。在这种情况下,您需要零次或多次非空白字符,因此您应该使用 \S*。您还应该转义 / 字符。当您指的是文字 . 而不是通配符时,您还需要转义 .。:

vars\/(prod\S*|stage\S*)\/(mysql|keys)\.yml

Here's a demo .

关于用于匹配具有前缀的目录的正则表达式模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33621520/

相关文章:

java - 查找具有特定模式但尚未在列表中找到的字符串(Java 正则表达式)

javascript - 当 * 后跟/时,用于捕获代码注释的正则表达式不起作用

git - 如果检测到匹配的文件,则运行一次 pre-commit.com Hook (不是针对每个文件)

svn - 自动为新文件添加 svn 关键字属性(服务器端)

没有经验的成员的 Git 工作流程

svn - 如何制作防止非 UTF-8 文件编码的预提交 Hook

regex - 多个文件上的 Linux shell

regex - 选择字符串结果上的 Powershell Select-Object 与 ForEach

git - merge 分支之间的大变化的技巧

git - 如何修复 Mercurial 卡在 Git subrepo 推送上?