groovy 是否有一种简单的方法来获取不带扩展名的文件名?
假设我有这样的内容:
new File("test").eachFile() { file->
println file.getName()
}
这将打印 test
目录中每个文件的完整文件名。有没有一种 Groovy 方法可以获取不带任何扩展名的文件名? (或者我又回到了正则表达式领域?)
Say I have something like this:
new File("test").eachFile() { file->
println file.getName()
}
This prints the full filename of every file in the test
directory. Is there a Groovy way to get the filename without any extension? (Or am I back in regex land?)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
我相信最好的方法是:
或者使用一个简单的正则表达式:
还有一个用于这种目的的 apache commons-io java lib,如果您使用 maven,您可以轻松依赖它:
I believe the grooviest way would be:
or with a simple regexp:
also there's an apache commons-io java lib for that kinda purposes, which you could easily depend on if you use maven:
最干净的方式。
String fileWithoutExt = file.name.take(file.name.lastIndexOf('.'))
The cleanest way.
String fileWithoutExt = file.name.take(file.name.lastIndexOf('.'))
最简单的方法是:
结果是:
Simplest way is:
Result is:
这对于以下文件名非常有效:
foo, foo.bar
但是如果你有一个文件 foo.bar.jar,那么上面的代码会打印出: foo
如果您希望它打印出 foo.bar ,那么下面的代码可以实现这一点。
This works well for file names like:
foo, foo.bar
But if you have a file foo.bar.jar, then the above code prints out: foo
If you want it to print out foo.bar instead, then the following code achieves that.
FilenameUtils 类是 apache commons io 包的一部分,有一个强大的解决方案。用法示例:
这不是常规方法,但如果您需要支持大量边缘情况,这可能会有所帮助。
The FilenameUtils class, which is part of the apache commons io package, has a robust solution. Example usage:
This isn't the groovy way, but might be helpful if you need to support lots of edge cases.
也许不像你想象的那么容易,但工作:
Maybe not as easy as you expected but working:
正如评论中提到的,文件名结尾 &延期开始取决于具体情况。在我的情况下,我需要获取以下类型文件的基本名称(没有路径的文件,和没有扩展名):{
foo.zip
,bar/foo.tgz
,foo.tar.gz
} =>;都需要生成“foo
”作为没有扩展名的文件名。 (大多数解决方案,给定foo.tar.gz
都会生成foo.tar
。)这是一个(明显的)解决方案,它将为您提供第一个“.”之前的所有内容;或者,您可以分段获取整个扩展名,或者(在本例中)作为单个剩余部分(将文件名拆分为
2
部分)。 (注意:虽然与手头的任务无关,但我也通过调用file.name
删除了路径。)As mentioned in comments, where a filename ends & an extension begins depends on the situation. In my situation, I needed to get the basename (file without path, and without extension) of the following types of files: {
foo.zip
,bar/foo.tgz
,foo.tar.gz
} => all need to produce "foo
" as the filename sans extension. (Most solutions, givenfoo.tar.gz
would producefoo.tar
.)Here's one (obvious) solution that will give you everything up to the first "."; optionally, you can get the entire extension either in pieces or (in this case) as a single remainder (splitting the filename into
2
parts). (Note: although unrelated to the task at hand, I'm also removing the path as well, by callingfile.name
.)您可以更好地使用正则表达式。
像下面这样的函数就可以解决这个问题:
You can use regular expressions better.
A function like the following would do the trick:
注意
下面的一些解决方案(使用 apache 库的解决方案除外)不适用于此示例 - c:/test.me/firstfile
如果我尝试查找上述条目的扩展名,我会get ".me/firstfile" - :(
更好的方法是查找最后一次出现的 File.separator(如果存在),然后查找文件名或扩展名。
注意:
(下面有一个小技巧。对于 Windows,文件分隔符是 \。但这是正则表达式中的特殊字符,因此当我们在正则表达式中使用包含 File.separator 的变量时,我必须对其进行转义。这就是我这样做的原因:
希望它有意义:)
尝试一下:
Note
Some of the below solutions (except the one using apache library) doesn't work for this example - c:/test.me/firstfile
If I try to find an extension for above entry, I will get ".me/firstfile" - :(
Better approach will be to find the last occurrence of File.separator if present and then look for filename or extension.
Note:
(There is a little trick happens below. For Windows, the file separator is \. But this is a special character in regular expression and so when we use a variable containing the File.separator in the regular expression, I have to escape it. That is why I do this:
Hope it makes sense :)
Try this out: