Java:解析一个字符串

时间:2015-07-31 22:41:47

标签: java string file

我在文件中有内容,我正在尝试剖析所述内容的某些部分。

文件内部: FNAME:John:LNAME:Doe:年龄:40:DOB:1975年7月31日

这一切都在一行

现在,我只想得到输出:

  • John Doe,1975年7月31日

目前的输出是:

  • John:LNAME:DOE:AGE:40:DOB:1975年7月31日

我尝试过使用:

System.out.println(line.substring(line.indexOf(":") + 1, line.lastIndexOf(":")));

但这只会削减" FNAME:"没有别的。

我希望对此进行详细解释,如果不是,我会道歉。谢谢你的帮助。

代码:

Scanner cfg_reader = new Scanner(cfg_file);
        cfg_reader.useDelimiter("~");

        while (cfg_reader.hasNext()) {
            String line = cfg_reader.next();
            System.out.println(line.substring(line.indexOf(":") + 1, line.lastIndexOf(":")));
            //System.out.println(cfg_reader.next());
        }

请注意,这是我目前的代码,我在代码选择之上提供的内容与此不同。

1 个答案:

答案 0 :(得分:3)

您可以使用正则表达式使用方法'split'拆分字符串,这将创建一个在该字符串上拆分的字符串数组。

因此,从您的示例line.split(":")将生成一个数组:

{"FNAME", "John", "LNAME", "Doe", "AGE", "40", "DOB", "July 31, 1975"}

然后,您可以迭代它并构建您想要的输出

例如:

import org.junit.Test;

import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.junit.Assert.assertThat;

public class FooTest {

    @Test
    public void foo() {
        String line = "FNAME:John:LNAME:Doe:AGE:40:DOB:July 31, 1975";

        final String[] split = line.split(":");
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < split.length; i++) {
            if (i % 2 != 0) {
                builder.append(split[i]);
                if (i != split.length -1) {
                    builder.append(" ");
                }
            }
        }
        assertThat(builder.toString(), is(equalTo("John Doe 40 July 31, 1975")));
    }
}

毫无疑问,这是一种更好的方式,但葡萄酒......