【发布时间】:2019-05-05 03:38:44
【问题描述】:
好的。我需要忽略版本控制中的文件列表,除了三个特定文件夹中的文件(我们称它们为 Folder1、Folder2 和 Folder3)。我可以将我需要忽略的所有文件夹作为普通列表列出,但我认为这不是一种优雅的方式,所以我编写了以下正则表达式:
.*/(Bin|bin)/(?!Folder1/|Folder2/|Folder3/).*
我的想法是这样的,从左到右:
- .* - 任意数量的任意字符。
- / - 斜线符号,用于分隔文件夹。
- (Bin|bin) - 名称为“Bin”或“bin”的文件夹。
- / - 斜线符号,用于分隔文件夹。
- (?!Folder1/|Folder2/|Folder3/) - 文件夹名称不是“Folder1/”,也不是“Folder2/”,也不是“Folder3/”。这部分是最复杂的,但我以某种方式搜索了它。我不明白为什么它应该起作用,但它在测试期间起作用。
- .* - 任意数量的任意字符。
当我在 regex101.com 使用几个文本字符串(代表文件的路径)对其进行测试时,这个表达式可以完美运行,但是当我将它放在我的 .hgignore 文件中时,它没有任何效果,如下所示:
syntax: regexp
.*/(Bin|bin)/(?!Folder1/|Folder2/|Folder3/).*
由于某种原因,它会忽略所有“Bin”和“bin”文件夹中的所有文件和子文件夹。我怎样才能完成我的任务?
附:据我所知,Mercurial/TortoiseHG 使用 Python/Perl 正则表达式。
非常感谢。
【问题讨论】:
-
您说 nothing 有效,但您说它忽略了 bin 中的文件/子文件夹。它是什么 ?可能是忽略正则表达式应该是积极的而不是消极的。试试改成
(?:fold1|2|3) -
正确的话应该是“它不能按需要工作”。如果我将正则表达式更改为正则,文件夹 1、2 和 3 将匹配正则表达式。我需要它来匹配除这些文件夹中的文件之外的所有文件夹和文件。 “.hgignore”文件被控制版本系统用来列出没有被版本控制的文件,即被 Mercurial 忽略的文件。我希望忽略所有 Bin 和 bin 文件夹(文件夹 1-3 除外)中的所有文件,因此它们应该与正则表达式匹配。不应忽略文件夹 1-3 中的文件,因此不应与正则表达式匹配。
-
有些不对劲。如果正则表达式匹配,文件 将 被处理?不然不会?如果是 Python,试试这个正则表达式
^(?:(?!(?:Bin|bin)/(?:Folder1|Folder2|Folder3)/).)*$,它将否定扩展到它应该在的 bin 文件夹。否则它将匹配所有个其他文件夹。 -
哎呀。 Mercurial 是版本控制系统,对吧?默认情况下,它会跟踪您放在存储库文件夹中的所有文件/文件夹的更改,对吗?有时不需要 Mercurial 来跟踪某些文件和文件夹(因为这些文件对于所有存储库用户来说都是不同的)。有时你可能有很多这样的文件(我的例子)。 Mercurial 有一个名为“.hgignore”的专用文件,您可以在其中使用正则表达式来选择您希望 Mercurial 不跟踪(即忽略)的所有文件。因此,如果文件与正则表达式匹配 - Mercurial 会忽略它。如果文件与正则表达式不匹配,Mercurial 不会忽略它。
-
我希望 Mercurial 忽略所有 Bin 和 bin 文件夹中的所有文件,除了“.../Bin/Folder1/...”、“.../Bin/Folder2/...”和“.../Bin/Folder3/...”。您建议的正则表达式都没有完成这项工作。 ^ 和 & 也不适用,因为 Bin 和 bin 文件夹可以位于文件夹/文件层次结构中的任何位置。
标签: regex mercurial tortoisehg