Mercurial .hgignore负向先行断言

11

使用Mercurial,我需要忽略除了名为“keepers”的特定目录中的文件之外的所有文件。

表面上看,这似乎可以通过使用Regex和Negative Lookahead简单实现;然而,尽管我能够在Regex Buddy和其他工具中验证我的正则表达式,在TortoiseHg中,它却不能按预期工作。

文件:

  • junk\junk.txt
  • junk\text
  • keepers\test\test
  • keepers\test\test2\hi.txt
  • keepersblah.txt

只有位于keepers目录下的两个文件不应被忽略。

这是我希望起作用的正则表达式:

^(?!keepers/).+$

遗憾的是,这会导致所有文件都被忽略。如果我将其更改为:

^(?!keepers).+$

它按照你预期的方式工作。也就是说,它会忽略任何不以“keepers”开头的文件/文件夹。但我确实想要忽略那些以“keepers”开头的文件。

奇怪的是,如果我将其更改为以下内容:

^(?!keepers/).+\..+$

它将正确匹配文件夹,但是如果没有扩展名,则不会忽略不在"keepers"文件夹中的文件。

任何建议都将不胜感激。

移除已失效的ImageShack链接。

1个回答

7
你的第一个表达式存在问题,因为正则表达式也会针对“keepers”本身进行测试。可以通过添加额外条件来解决这个问题:
^(?!keepers(?:/|$))

或者(不够紧凑,但更容易理解):
^(?!keepers/|keepers$)

我也尝试了^(?!keepers\b),但它无法匹配"keepers.txt"。 - eswald
太棒了!非常感谢,两种方法都完美地解决了问题。我已经头痛了一个小时 :) - Michael La Voie
2
在look-ahead断言中,不需要使用非捕获组,因为它无论如何都不会被捕获:^(?!keepers(/|$)).* - Tomalak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接