43

我需要一个 .hgdontignore 文件 :-) 来包含某些文件并排除目录中的所有其他内容。基本上,我只想包含特定目录中的 .jar 文件,仅此而已。我怎样才能做到这一点?我对正则表达式语法不太熟练。或者我可以用 glob 语法来做吗?(为了可读性,我更喜欢那个)

就像一个示例位置,假设我想排除foo/bar/foo/bar/*.jar.

4

3 回答 3

42

迈克尔的回答很好,但另一种选择是排除:

foo/bar/**

然后手动添加 .jar 文件。您始终可以添加被忽略规则排除的文件,它会覆盖忽略。您只需要记住添加您将来创建的任何罐子。

于 2009-10-04T04:21:12.570 回答
38

为此,您需要使用以下正则表达式:

foo/bar/.+?\.(?!jar).+

解释

你告诉它要忽略什么,所以这个表达式正在搜索你想要的东西。

  1. 您查找名称(包括相对目录)包含 (foo/bar/) 的任何文件
  2. 然后查找句点之前的任何字符( .+?\. == 匹配任何时间的一个或多个字符,直到到达句点字符)
  3. 然后确保它没有“jar”结尾 (?!jar)(这称为负面展望
  4. 最后你抓住它确实有的结局 (.+)

正则表达式很容易搞砸,所以我强烈建议您使用Regex Buddy之类的工具来帮助您构建它们。它将正则表达式分解成简单的英语,这真的很有帮助。

编辑

Jason S,你抓住了我,它确实错过了那些文件。

这个更正的正则表达式适用于您列出的每个示例:

foo/bar/(?!.*\.jar$).+

它发现:

  • foo/bar/baz.txt
  • 富/酒吧/巴兹
  • 富/酒吧/罐
  • foo/bar/baz.jar.txt
  • foo/bar/baz.jar。
  • 富/酒吧/巴兹。
  • foo/bar/baz.txt。

但是没有找到

  • foo/bar/baz.jar

新解释

这表示在 "foo/bar/" 中查找文件,然后如果有零个或多个字符后跟 ".jar" 并且没有更多字符($ 表示行尾),则不匹配,然后,如果不是在这种情况下,匹配任何以下字符。

于 2009-10-02T22:27:19.450 回答
1

任何想要使用负前瞻(或?!正则表达式语法)或任何类型的反向引用机制的人都应该知道 Mercurial 将从谷歌的模块退回RE2到 Python 的re模块进行匹配。

RE2是一个非回溯引擎,可保证运行时与输入的大小成线性关系。如果性能对您很重要,也就是说,如果您有一个大存储库,您应该考虑坚持使用 Re2 支持的更简单的模式,这就是我认为Ryan 提供的解决方案的原因。

于 2020-01-10T09:27:36.103 回答