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