groovy有一个简单的方法来获取没有扩展名的文件名吗?

Ele*_*hoy 47 java file-io groovy file-extension

说我有这样的事情:

new File("test").eachFile() { file->  
println file.getName()  
}
Run Code Online (Sandbox Code Playgroud)

这将打印test目录中每个文件的完整文件名.是否有一种Groovy方式来获取没有任何扩展名的文件名?(或者我回到正则表达式土地?)

Nik*_*kov 48

我相信最流行的方式是:

file.name.lastIndexOf('.').with {it != -1 ? file.name[0..<it] : file.name}
Run Code Online (Sandbox Code Playgroud)

或者使用简单的正则表达式:

file.name.replaceFirst(~/\.[^\.]+$/, '')
Run Code Online (Sandbox Code Playgroud)

还有一个apache commons-io java lib用于那种目的,如果你使用maven,你很容易依赖它:

org.apache.commons.io.FilenameUtils.getBaseName(file.name)
Run Code Online (Sandbox Code Playgroud)


Pie*_*ier 30

最干净的方式.

String fileWithoutExt = file.name.take(file.name.lastIndexOf('.'))

  • 没有扩展名的文件将无法使用此功能。 (3认同)
  • 在以下情况下,它会产生不直观的预期结果: `assert ['.foobar', 'foobar'].collect { it.take(it.lastIndexOf('.')) } == ['', '']` (2认同)

Mau*_*cco 7

new File("test").eachFile() { file->  
    println file.getName().split("\\.")[0]
}
Run Code Online (Sandbox Code Playgroud)

这适用于文件名,如:foo,foo.bar

但是如果你有一个文件foo.bar.jar,那么上面的代码打印出来:foo如果你想要打印出foo.bar,那么下面的代码就可以实现.

new File("test").eachFile() { file->  
    def names = (file.name.split("\\.")
    def name = names.size() > 1 ? (names - names[-1]).join('.') : names[0]
    println name
}
Run Code Online (Sandbox Code Playgroud)


Jay*_* P. 6

FilenameUtils类是apache commons io软件包的一部分,具有可靠的解决方案。用法示例:

import org.apache.commons.io.FilenameUtils

String filename = '/tmp/hello-world.txt'
def fileWithoutExt = FilenameUtils.removeExtension(filename)
Run Code Online (Sandbox Code Playgroud)

这不是常规的方法,但是如果您需要支持很多边缘情况,可能会有所帮助。


lib*_*cha 6

最简单的方法是:

'file.name.with.dots.tgz' - ~/\.\w+$/????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

结果是:

file.name.with.dots
Run Code Online (Sandbox Code Playgroud)


Ale*_*ger 5

也许不像你想象的那么容易,但工作:

new File("test").eachFile { 
  println it.name.lastIndexOf('.') >= 0 ? 
     it.name[0 .. it.name.lastIndexOf('.')-1] : 
     it.name 
  }
Run Code Online (Sandbox Code Playgroud)