请在下面找到我的代码。我试图遍历文件和目录,并打印出所有匹配到正则表达式:(&)(.+?\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)/)
}
}
}
答案 0 :(得分: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]等在别处打印/使用。
答案 1 :(得分:0)
w.readLines().grep(~/(&)(.+?\b)/)
没有做任何输出,它会为匹配的行提供返回值,因此如果您将其更改为println w.readLines().grep(~/(&)(.+?\b)/)
或w.readLines().grep(~/(&)(.+?\b)/).each { println it }
,您将获得打印的匹配行stdout
。
顺便说一下。
def s= "${file.text}";
def w = s.toString();
w.readLines()
只是浪费时间。它与file.text.readLines()
完全相同。
"${file.text}"
是一个GString
,用于替换评估中的占位符,但除了file.text
占位符之外什么都没有,这与file.text as String
或{{1}相同}}
但由于file.text.toString()
实际上已经是file.text
,因此它与String
相同。
即使您需要file.text
,因为其中不仅包含占位符,GString
已经有GString
方法,因此无需使用readLines()
首先,即使.toString()
是必要的。