除.hg_keep之外的所有文件的正则表达式

时间:2010-11-26 12:13:03

标签: regex mercurial hgignore

我使用空的.hg_keep文件在Mercurial中保留一些(否则为空)文件夹。

问题在于我找不到除.hg_keep个文件之外的所有内容的正则函数。

假设我们有这个文件结构:

a/b/c2/.hg_keep
a/b/c/d/.hg_keep
a/b/c/d/file1
a/b/c/d2/.hg_keep
a/b/.hg_keep
a/b/file2
a/b/file1
a/.hg_keep
a/file2
a/file1

我希望仅在.hg_keep下保留a/b/个文件。

http://gskinner.com/RegExr/的帮助下,我创建了以下.hgignore

syntax: regexp
.*b.*/(?!.*\.hg_keep)

但Mercurial会忽略.hg_keep子文件夹中的所有b个文件。

# hg status
? .hgignore
? a/.hg_keep
? a/b/.hg_keep
? a/file1
? a/file

# hg status -i
I a/b/c/d/.hg_keep
I a/b/c/d/file1
I a/b/c/d2/.hg_keep
I a/b/c2/.hg_keep
I a/b/file1
I a/b/file2

我知道我可以hd add所有.hg_keep个文件,但是有一个带有正则表达式(或glob)的解决方案吗?

4 个答案:

答案 0 :(得分:3)

Regexp否定可能对此有用。如果您想忽略 a/b/.hg_keep文件之外的所有内容,您可以使用:

^(?!a/b/\.hg_keep)$

这个正则表达式的部分重要是:

^                   anchor the match to the beginning of the file path
(?!  ... )          negation of the expression between '!' and ')'
a/b/\.hg_keep       the full path of the file you want to match
$                   anchor the match to the end of the file path

正则表达式

^a/b/\.hg_keep$

仅匹配 名为a/b/.hg_keep的文件。

否定

^(?!a/b/\.hg_keep)$

将匹配其他所有内容。

答案 1 :(得分:1)

不太确定您在使用正则表达式的上下文中应该是这样,这匹配所有以.hg_keep结尾的行:

^.*\.hg_keep$

编辑:以下是正则表达式,用于匹配与上述表达式不匹配的项目:

^(?:(?!.*\.hg_keep).)*$

答案 2 :(得分:0)

尝试(?!.*/\.hg_keep$)

答案 3 :(得分:0)

寻找类似的东西。 找到了答案,但这不是我们想听到的。

  
      
  1. 限制
  2.         

    没有简单的方法可以忽略除一组文件之外的所有文件。与其他模式结合使用时,尝试使用反向正则表达式匹配将失败。这是一个故意的限制,因为替代格式都被认为太可能混淆用户值得额外的灵活性。

         

    参考:https://www.mercurial-scm.org/wiki/.hgignore