使用Java中的文件名和扩展名清理字符串

时间:2016-11-10 13:44:02

标签: java regex string

拥有这四种类型的文件名:

  1. 带双扩展名的文件名
  2. 没有扩展名的文件名
  3. 末尾有点的文件名,没有扩展名
  4. 具有正确名称的文件名。
  5. 像这样:

    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
    

    提前致谢。

5 个答案:

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