Groovy 使用eachDirMatch跳过.svn文件夹

Groovy 使用eachDirMatch跳过.svn文件夹,groovy,Groovy,我正在写一个程序,需要遍历一组目录。尝试使用以下代码: file.eachDirMatch(/.[^.svn]/){ //这里有一些代码 } 但结果与我的目录都不匹配。我意识到这可以归结为找出正确的正则表达式,但即使在重温了一些Java正则表达式文档之后,我认为这应该是可行的 试试这个正则表达式: /^(?!\.svn).*/ (这假设您的语言的正则表达式风格支持负lookaheads。)您可以使用任何表达式作为匹配器,而不仅仅是正则表达式: file.eachDirMatch({ new F

我正在写一个程序,需要遍历一组目录。尝试使用以下代码:

file.eachDirMatch(/.[^.svn]/){ //这里有一些代码 }


但结果与我的目录都不匹配。我意识到这可以归结为找出正确的正则表达式,但即使在重温了一些Java正则表达式文档之后,我认为这应该是可行的

试试这个正则表达式:

/^(?!\.svn).*/

(这假设您的语言的正则表达式风格支持负lookaheads。)

您可以使用任何表达式作为匹配器,而不仅仅是正则表达式:

file.eachDirMatch({ new File(it).name != ".svn" }) { dir -> println(dir.getPath()) }

根据琥珀色的回答,整个事情看起来像

file.eachDirMatch(~/^(?!\.svn).*/) { /* some code here */ }
例如,要过滤掉当前目录中所有隐藏的目录,可以使用

file('.').eachDirMatch(~/^(?!\.).*/) { dir ->
    println dir.getPath()
}
对于外行(regex)来说,这看起来像胡言乱语。为什么不直接做呢

directories = []
file.eachDir() { File directory -> 
    if (directory.name != ".svn") {
      directories << directory
    }
}
目录=[]
file.eachDir(){file directory->
if(directory.name!=“.svn”){
目录
如果(!directory.startsWith(“.”){

目录尝试一个基本的
/.*/
,然后确保您实际上是在匹配某个东西-
*
应该匹配传入的任何东西,因此它可能不是正则表达式的错误。/.*/不起作用,但~“*”起作用了。Groovy文档使我看起来可以使用/-表示法。尝试了~*[^svn]”这确实起到了作用,但我不喜欢它与“.svn”以外的目录相匹配的事实。好的,终于知道我做错了什么。你的正则表达式工作正常,我只需要添加“~”在模式的字符串或/表示法之前。感谢您的帮助。有人能解释一下原因吗?刚才遇到了相同的问题。为什么我必须添加波浪线才能传递regexp?@Matthias:[请看。tilde是一个用于创建模式实例的Groovy运算符,斜杠只是用来分隔字符串。不确定您是否需要
新文件(it)
构造函数。我认为
it
已经是一个文件对象了。
directories = []
file.eachDir() { File directory -> 
    if (!directory.startsWith(".")) {
      directories << directory
    }
}