我的源文件是制表符分隔的,我需要对第 4 列值进行 grep。我怎样才能在 Groovy 中做到这一点?这是我的代码不起作用。它甚至接近吗?
def tab_file = new File('source_file.tab')
tab_file.eachline { line -> println line.grep('\t\t\t\t'}
您可以按制表符拆分,这将为您提供一个可以索引的数组以获取该列:
groovy:000> s = "aaa\tbbb\tccc\tddd\teee";
===> aaa bbb ccc ddd eee
groovy:000> s.split("\\t")[3]
===> ddd
像下面这样的东西应该可以工作:
tab_file.eachLine { line ->
println ((line =~ /([^\t]*\t){3}([^\t]*)/)[0][2])
}
说明:
操作员使用右侧的模式=~
创建一个对象。Groovy 允许您通过数组下标运算符java.util.regex.Matcher
隐式执行。find()
如果您的正则表达式中有组,则List
每个结果都会产生一个。该列表将整个匹配区域作为元素 0,然后将组作为其他元素。[0][2]
正则表达式的第一个匹配(零索引)也是如此,特别是第二组匹配。(顺便说一句,如果正则表达式中没有组,则结果只是一个匹配的字符串)。详细信息/示例在这里。
更新/旁白:
我只是在研究添加到Objectgrep()
的fxnality ,因为我很好奇。我不确定我是否看到了集合类型之外的实用程序,但是当应用于字符串时,它不会像您预期的那样 - 它似乎循环遍历字符串中的字符,并将每个字符与传入的字符进行比较字符串(收集列表中的匹配项)。如果您传入的字符串大于 1 个字符,则您将永远无法匹配,因为每次迭代检查的字符永远不会等于传入的整个字符串(在您的示例中, any )\t != "\t\t\t\t"