如何使用split()正确拆分文件名的String输入?

时间:2014-07-15 19:30:26

标签: java regex string split

我正在创建一个ImageViewer应用程序,它会提示用户使用showInputDialog首先输入第一个图像文件名的名称。但是,我因使用String而无法拆分split()。例如,用户输入 image1.gif ,我必须确保我可以将它们分成三个元素。首先是图像,然后是 1 ,最后是 gif 。所以你们认为你可以帮助我吗?提前谢谢!

public static void main(String [] args)
{
    //First input dialog. Example from user will be like:  image1.gif
    String userInput = JOptionPane.showInputDialog("Please input name of first image file");
    Scanner myScanner = new Scanner(userInput);
    String a = userInput.split(".");
    String fileName = myScanner.next();
    String fileNumber = myScanner.next();
    String fileFormat = myScanner.next();
}

这是试用部分。但它表示Array索引超出了绑定范围。有什么建议吗?

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

class TestImageViewer {

public static void main(String [] args)
{
    //First input dialog. Example from user will be like:  image1.gif
    String userInput = JOptionPane.showInputDialog("Please input name of first image file");
    Scanner myScanner = new Scanner(userInput);
    String[] a = userInput.split(".");


    System.out.println(a[0]);

}
}

3 个答案:

答案 0 :(得分:2)

您分割到的内容必须返回到数组以存储拆分的String的所有部分。所以,像这样:

String[] a = userInput.split(".");

在此示例中,

a[0]将保留 Image1 a[1]将保留 gif 。知道了这一点,你就可以得到数组第一个索引的字母,如下所示:

String number = a[0].replaceAll("[^0-9.]", "");

和数字如:

String letter = a[0].replaceAll("[0-9.]", "");

这些是正则表达式函数,可能很好地了解一下。

编辑:为了回应OP的编辑,我想我没有把我的代码放在上下文中。这是完整的代码:

public static void main(String [] args) {
    //First input dialog. Example from user will be like:  image1.gif
    String directions = JOptionPane.showInputDialog("Please input name of first image file");

    // System.in will set up the scanner to read user input from the keyboard. 
    // myScanner.next() will grab the first "token" (a section of text without spaces) from this input
    Scanner myScanner = new Scanner(System.in);

    // Create variables to store name, number and extension
    String letters, number, ext;
    String fileName = myScanner.next();
    if (fileName.indexOf(".") > -1) {
        String[] a = userInput.split(".");
        letter = a[0].replaceAll("[0-9.]", "");
        number = a[0].replaceAll("[^0-9.]", "");
        ext = a[1];
    }
}

但是,您似乎并没有掌握在Java中使用Scanner类的一些基础知识。希望这会有所帮助,但请尝试查看其他示例。

答案 1 :(得分:2)

您可以尝试使用正则表达式和Matcher来提高输入文件模式的灵活性:

Pattern pattern = Pattern.compile("(.+)(\\d+)\\.(\\w+)");
Matcher matcher = pattern.matcher("image1.gif");
if(matcher.find()) {
    String fileName = matcher.group(1);
    String fileNumber = matcher.group(2);
    String fileFormat = matcher.group(3);
}

(.+)(\\d+)\\.(.+)表示由一个或多个字符组成的模式,后跟一个或多个数字,然后是一个点,最后是一个或多个表示文件扩展名的单词字符。其中每一个都在括号内的小组中捕获。

matcher.group(1)返回image

匹配的(.+)

matcher.group(2)返回1

匹配的(\\d+)

matcher.group(3)返回gif

匹配的(\\w+)

答案 2 :(得分:1)

split返回一个包含字符串不同部分的数组。因此,如果您使用.作为分隔符,则至少需要提供一个将通过调用split来设置的数组。其次,您可能想尝试另一种查找fileNumber的方法,因为您的文件似乎没有格式化为 image.1.gif