常规是否有一个简单的方法来获得不带扩展名的文件名?(Does groovy have an easy

2019-08-18 04:16发布

说我有这样的事情:

new File("test").eachFile() { file->  
println file.getName()  
}

这将打印在每个文件的完整文件名test目录。 是否有一个Groovy的方式来获得不带任何扩展名? (还是我回到了正则表达式的土地?)

Answer 1:

我相信grooviest方法是:

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

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

file.name.replaceFirst(~/\.[^\.]+$/, '')

也有针对这有点儿目的,你可以很容易地依靠如果你使用Maven的一个Apache的commons-io的java的lib目录下:

org.apache.commons.io.FilenameUtils.getBaseName(file.name)


Answer 2:

最彻底的方法。

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



Answer 3:

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

这非常适用于文件名,如: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
}


Answer 4:

如你预期,但工作也许并不容易:

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


Answer 5:

的FilenameUtils类,它是Apache公地IO包的一部分,具有强大的解决方案。 实例:

import org.apache.commons.io.FilenameUtils

String filename = '/tmp/hello-world.txt'
def fileWithoutExt = FilenameUtils.removeExtension(filename)

这不是常规的方式,但如果你需要支持大量的边缘情况可能会有所帮助。



Answer 6:

简单的方法是:

'file.name.with.dots.tgz' - ~/\.\w+$/​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

结果是:

file.name.with.dots


Answer 7:

正如在评论中提到,在文件名结尾与扩展开始视情况而定。 在我的情况,我需要得到以下类型的文件的基本名称(文件没有路径没有扩展名):{ foo.zipbar/foo.tgzfoo.tar.gz } =>所有需要出示“ foo “作为文件名扩展SANS。 (大多数解决方案,给出foo.tar.gz会产生foo.tar 。)

这里有一个(明显)解决方案,它会给你一切行动的第一个“”; 任选地,可以得到无论是在片或整个延伸(在这种情况下),为单一的余数(分割文件名到2份)。 (注:虽然无关手头的任务,我也去掉路径中,通过调用file.name 。)

file=new File("temp/foo.tar.gz")
file.name.split("\\.", 2)[0]    // => return "foo" at [0], and "tar.gz" at [1]


Answer 8:

您可以使用正则表达式更好。 像下面的函数会做的伎俩:

def getExtensionFromFilename(filename) {
  def returned_value = ""
  m = (filename =~ /(\.[^\.]*)$/)
  if (m.size()>0) returned_value = ((m[0][0].size()>0) ? m[0][0].substring(1).trim().toLowerCase() : "");
  return returned_value
}


Answer 9:

注意

import java.io.File;

def fileNames    = [ "/a/b.c/first.txt", 
                     "/b/c/second",
                     "c:\\a\\b.c\\third...",
                     "c:\\a\b\\c\\.text"
                   ]

def fileSeparator = "";

fileNames.each { 
    // You can keep the below code outside of this loop. Since my example
    // contains both windows and unix file structure, I am doing this inside the loop.
    fileSeparator= "\\" + File.separator;
    if (!it.contains(File.separator)) {
        fileSeparator    =  "\\/"
    }

    println "File extension is : ${it.find(/((?<=\.)[^\.${fileSeparator}]+)$/)}"
    it    =  it.replaceAll(/(\.([^\.${fileSeparator}]+)?)$/,"")

    println "Filename is ${it}" 
}

/test.me/firstfile:C - 一些下面的解决方案(除了使用Apache库中的一个)并不在这个例子中工作

如果我试图找到上面的条目延期,我会得到“.ME / firstfile” - :(

更好的方法将是如果存在找到文件分割符的最后出现,然后查找文件名或扩展。

注:(还有一个小窍门下面发生在Windows中,文件分隔符是\但是,这是在正则表达式等特殊字符时,我们使用包含文件分割符在正则表达式的变量,我必须逃脱它这就是为什么我这样做:

def fileSeparator= "\\" + File.separator;

希望这是有道理的:)

尝试了这一点:

import java.io.File;

String strFilename     =  "C:\\first.1\\second.txt";
// Few other flavors 
// strFilename = "/dd/dddd/2.dd/dio/dkljlds.dd"

def fileSeparator= "\\" + File.separator;
if (!strFilename.contains(File.separator)) {
    fileSeparator    =  "\\/"
}

def fileExtension = "";
(strFilename    =~ /((?<=\.)[^\.${fileSeparator}]+)$/).each { match,  extension -> fileExtension = extension }
println "Extension is:$fileExtension"


Answer 10:

// Create an instance of a file (note the path is several levels deep)
File file = new File('/tmp/whatever/certificate.crt')

// To get the single fileName without the path (but with EXTENSION! so not answering the question of the author. Sorry for that...)
String fileName = file.parentFile.toURI().relativize(file.toURI()).getPath()


文章来源: Does groovy have an easy way to get a filename without the extension?