0

请在下面找到我的代码。我正在尝试遍历文件和目录并打印出与正则表达式的所有匹配项:(&)(.+?\b) 但这似乎不起作用(它返回一个空字符串)。我哪里做错了?

import groovy.io.FileType

class FileExample {
    static void main(String[] args) {

        def list = []

        def dir = new File("*path to dir*")
        dir.eachFileRecurse (FileType.FILES) { file ->
            list << file.name;
            def s= "${file.text}";
            def w = s.toString();
            w.readLines().grep(~/(&)(.+?\b)/)
        }
    }
}
4

2 回答 2

0

我想到了:

import groovy.io.FileType
class FileExample {
   static void main(String[] args) {

        def list = []
        def dir = new File("/path/to/directory/containingfiles")
        def p = []
        dir.eachFileRecurse (FileType.FILES) { 
            file -> list << file.name
            def s = file.text
            def findtp = (s =~ /(&)(.+?\b)/)
            findtp.each {
                p.push(it[2])
                // As I'm only interested in the second matched group
            }
        }
        p.each { 
            println it
            }
        }
    }

现在,所有匹配的字符串都存储在数组 p 中,并且可以由 p[0] 等在其他地方打印/使用。

于 2017-12-04T23:40:10.380 回答
0

w.readLines().grep(~/(&)(.+?\b)/)不做任何输出,它给你匹配的行作为返回值,所以如果你把它改成println w.readLines().grep(~/(&)(.+?\b)/)or w.readLines().grep(~/(&)(.+?\b)/).each { println it },你会得到匹配的行打印在stdout.

顺便提一句。

 def s= "${file.text}";
 def w = s.toString();
 w.readLines()

只是浪费时间。它与 完全相同file.text.readLines()

"${file.text}"GString在评估中替换占位符的 a ,但是由于您只有file.text占位符,所以这与file.text as Stringor相同file.text.toString()

file.text实际上String已经是 a,它与file.text.

即使你需要,GString因为你有更多的占位符,GString已经有一个readLines()方法,所以不需要.toString()先使用,即使 aGString是必要的。

于 2017-12-04T23:53:40.063 回答