我需要一个 .hgdontignore 文件 :-) 来包含某些文件并排除目录中的所有其他内容。基本上,我只想包含特定目录中的 .jar 文件,仅此而已。我怎样才能做到这一点?我对正则表达式语法不太熟练。或者我可以用 glob 语法来做吗?(为了可读性,我更喜欢那个)
就像一个示例位置,假设我想排除foo/bar/
除foo/bar/*.jar
.
迈克尔的回答很好,但另一种选择是排除:
foo/bar/**
然后手动添加 .jar 文件。您始终可以添加被忽略规则排除的文件,它会覆盖忽略。您只需要记住添加您将来创建的任何罐子。
为此,您需要使用以下正则表达式:
foo/bar/.+?\.(?!jar).+
解释
你告诉它要忽略什么,所以这个表达式正在搜索你不想要的东西。
正则表达式很容易搞砸,所以我强烈建议您使用Regex Buddy之类的工具来帮助您构建它们。它将正则表达式分解成简单的英语,这真的很有帮助。
编辑
嘿Jason S,你抓住了我,它确实错过了那些文件。
这个更正的正则表达式适用于您列出的每个示例:
foo/bar/(?!.*\.jar$).+
它发现:
但是没有找到
新解释
这表示在 "foo/bar/" 中查找文件,然后如果有零个或多个字符后跟 ".jar" 并且没有更多字符($ 表示行尾),则不匹配,然后,如果不是在这种情况下,匹配任何以下字符。
任何想要使用负前瞻(或?!
正则表达式语法)或任何类型的反向引用机制的人都应该知道 Mercurial 将从谷歌的模块退回RE2
到 Python 的re
模块进行匹配。
RE2是一个非回溯引擎,可保证运行时与输入的大小成线性关系。如果性能对您很重要,也就是说,如果您有一个大存储库,您应该考虑坚持使用 Re2 支持的更简单的模式,这就是我认为Ryan 提供的解决方案的原因。