我试图从tsv传递一个文件名并将其拆分成一个数组,如下所示:
new File("filenames.tsv").eachLine( { String file_iter ->
println file_iter
def details = file_iter.split(".")
println details
})
printlns的输出:
stad.all.16jan15.TP.pwpv
[]
为什么数组是空的?我确定我错过了一些明显的东西。
答案 0 :(得分:2)
String#split将正则表达式作为参数。
.
是正则表达式特殊字符,请参阅regex tutorial:
因为我们想要做的不仅仅是搜索文字文本,我们需要保留某些特殊用途的字符。在本教程中讨论的正则表达式中,有12个具有特殊含义的字符:反斜杠\,插入符号^,美元符号$,句点或点。,竖线或竖线符号|,问号?,星号或星号*,加号+,左括号(,右括号)和左方括号[,开口大括号{,这些特殊字符通常称为“元字符”。
如果要在正则表达式中使用任何这些字符作为文字,则需要使用反斜杠转义它们。如果要匹配1 + 1 = 2,则正确的正则表达式是1 + 1 = 2。否则,加号具有特殊含义。
使用Java字符串文字语法,反斜杠是转义字符,因此在Java中,您必须双重转义反斜杠才能使其正确显示。 Groovy adds options for specifying string literals所以你可以使用slashy字符串语法来避免双重转义。
作为groovysh的一个例子:
groovy:000> s = 'asdf.zxcv.qwerty'
===> asdf.zxcv.qwerty
没有逃脱,句号意味着一切都是分隔符,所以结果是空的
groovy:000> s.split('.')
===> []
使用Java双转义语法
groovy:000> s.split('\\.')
===> [asdf, zxcv, qwerty]
使用斜线字符串文字语法
groovy:000> s.split(/\./)
===> [asdf, zxcv, qwerty]
请注意,即使闭包是eachLine的参数,您也不需要将闭包括在parens中,您可以将其写为:
new File('filenames.tsv').eachLine { String file_iter ->
println file_iter
def details = file_iter.split(/\./)
println details
}