拥有这四种类型的文件名:
像这样:
String doubleexsension = "doubleexsension.pdf.pdf";
String noextension = "noextension";
String nameWithDot = "nameWithDot.";
String properName = "properName.pdf";
String extension = "pdf";
我的目标是清理所有类型并正确输出filename.filetype
。为了发表这篇文章,我制作了一个愚蠢的剧本:
ArrayList<String> app = new ArrayList<String>();
app.add(doubleexsension);
app.add(properName);
app.add(noextension);
app.add(nameWithDot);
System.out.println("------------");
for(String i : app) {
// Ends with .
if (i.endsWith(".")) {
String m = i + extension;
System.out.println(m);
break;
}
// Double extension
String p = i.replaceAll("(\\.\\w+)\\1+$", "$1");
System.out.println(p);
}
输出:
------------
doubleexsension.pdf
properName.pdf
noextension
nameWithDot.pdf
我不知道如何处理noextension
一个。我该怎么做?如果没有扩展名,则应该使用extension
值并将其绑定到最后的字符串。
我想要的输出是:
------------
doubleexsension.pdf
properName.pdf
noextension.pdf
nameWithDot.pdf
提前致谢。
答案 0 :(得分:4)
您可以添加正则表达式的替代方案以匹配各种场景:
(?:(\.\w+)\1*|\.|([^.]))$
并替换为$2.pdf
。请参阅regex demo。
编辑:如果已知可以复制的扩展程序,您可以通过替换组使用白名单方法:
(?:(\.(?:pdf|gif|jpe?g))\1*|\.|([^.]))$
查看另一个regex demo。
<强>详情:
(?:
- 开始分组,字符串锚点的$
结尾应用于下面的所有替代方案(它们必须位于字符串的末尾)
(\.\w+)\1*
- 重复(或不重复)扩展(.
+ 1+个字符重复零次或多次)(使用白名单方法,只会考虑指定的扩展名 - {{ 1}}只会匹配(?:pdf|gif|jpe?g)
,pdf
,jpeg gif
等,如果添加了更多替代方案,那么<} li>
, jpg
- 或|
- 一个点\.
- 或|
- 任何不是捕获到第2组的点的字符([^.])
- 外部分组的结束)
- 字符串结束。请参阅Java demo:
$
答案 1 :(得分:2)
易
if (-1 == i.indexOf('.'))
System.out.println(i + "." + extension);
答案 2 :(得分:1)
我会避免正则表达式的复杂性(以及降低的可读性):
String m = i;
if (m.endsWith(".")) {
m = m + extension;
}
if (m.endsWith("." + extension + "." + extension)) {
m = m.substring(0, m.length() - extension.length() - 1);
}
if (!m.endsWith("." + extension)) {
m = m + "." + extension;
}
答案 3 :(得分:0)
为什么这么复杂。只需str.replaceAll("\\..*", "") + "." + extension
答案 4 :(得分:-1)
Java 7 NIO可以通过使用PathMatcher
来实现此目的PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:*.pdf");
Path filename = namewithdot.pdf;
if (matcher.matches(filename)) {
System.out.println(filename);
}