为什么不分裂在这里工作?

时间:2015-06-12 19:17:33

标签: regex groovy

我试图从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
[]

为什么数组是空的?我确定我错过了一些明显的东西。

1 个答案:

答案 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 
}