【发布时间】:2010-12-03 11:31:44
【问题描述】:
我需要一个 .hgdontignore 文件 :-) 来包含某些文件并排除目录中的所有其他内容。基本上,我只想包含特定目录中的 .jar 文件,仅此而已。我怎样才能做到这一点?我对正则表达式语法不太熟练。或者我可以用 glob 语法来做吗? (为了可读性我更喜欢那个)
作为一个示例位置,假设我想排除 foo/bar/ 下的所有文件,foo/bar/*.jar 除外。
【问题讨论】:
我需要一个 .hgdontignore 文件 :-) 来包含某些文件并排除目录中的所有其他内容。基本上,我只想包含特定目录中的 .jar 文件,仅此而已。我怎样才能做到这一点?我对正则表达式语法不太熟练。或者我可以用 glob 语法来做吗? (为了可读性我更喜欢那个)
作为一个示例位置,假设我想排除 foo/bar/ 下的所有文件,foo/bar/*.jar 除外。
【问题讨论】:
Michael 的回答很好,但另一种选择是排除:
foo/bar/**
然后手动添加 .jar 文件。您始终可以添加被忽略规则排除的文件,它会覆盖忽略。您只需要记住添加您将来创建的任何 jars。
【讨论】:
为此,您需要使用以下正则表达式:
foo/bar/.+?\.(?!jar).+
说明
你告诉它要忽略什么,所以这个表达式正在搜索你不想要的东西。
正则表达式很容易弄乱,所以我强烈建议你使用像Regex Buddy 这样的工具来帮助你构建它们。它会将正则表达式分解成简单的英语,这真的很有帮助。
编辑
嘿Jason S,你抓住了我,它确实错过了那些文件。
这个更正的正则表达式适用于您列出的每个示例:
foo/bar/(?!.*\.jar$).+
它发现:
但是没有找到
新解释
这表示在 "foo/bar/" 中查找文件,然后如果有零个或多个字符后跟 ".jar" 并且没有更多字符($ 表示行尾),则不匹配,然后,如果不是这样,匹配任何以下字符。
【讨论】:
foo/bar/ 部分很简单,所以让我们暂时忘记它。如果您可以修复它,使其匹配文件“baz.txt”、“baz”、“jar”、“baz.jar.txt”、“baz.jar.”、“baz.”和“baz.txt”。 "但不是“baz.jar”,那么我会接受。 :-)
syntax: regexp。您可以稍后在文件中恢复为syntax: glob。
re:foo/bar/(?!.*\.jar$).+ 来代表那一行。
任何想要使用负前瞻(或正则表达式语法中的?!)或任何类型的反向引用机制的人都应该知道,Mercurial 将从 google 的 RE2 退回到 Python 的 re 模块进行匹配。
RE2 是一个非回溯引擎,可确保运行时与输入的大小成线性关系。如果性能对您很重要,也就是说,如果您有一个大型存储库,您应该考虑坚持使用 Re2 支持的更简单的模式,这就是我认为 solution offered by Ryan 的原因。
【讨论】: