在Java中按字符拆分字符串

14

我从网络获取了一个字符串,它长这样:

Latest Episode@04x22^Killing Your Number^May/15/2009

然后我需要将04x22Killing Your NumberMay/15/2009存储在不同的变量中,但它无法正常工作。

String[] all = inputLine.split("@");
String[] need = all[1].split("^");
show.setNextNr(need[0]);
show.setNextTitle(need[1]);
show.setNextDate(need[2]);

现在它只存储NextNr,包含整个字符串

04x22^Killing Your Number^May/15/2009

出了什么问题?

5个回答

32

String.split(String regex)

此方法参数为正则表达式,其中^有特殊含义,表示“锚定在开头”。

您需要执行以下操作:

String[] need = all[1].split("\\^");

通过转义^字符,您是在告诉程序“我指的是字符 '^' ”。


3
使用正则表达式进行分割是最慢的。 看一下谷歌的Guava库中的Splitter类。 - Agoston Horvath
9
通常(或者说总是),建议某人在项目中包含一个巨大的依赖项,以便为您并不真正关心且对整体没有任何影响的微小优化而削减几个纳秒的时间,这并不是一个好建议。此外,还要注意:过早进行优化。 - Brian Roach
Guava是一个设计良好的通用库,非常适合与jre libs搭配使用。它不是“巨大的”,也不仅仅对于这一个问题有用。 顺便说一句,String.split()每次执行时都会编译正则表达式。强烈不建议在测试和初始化之外使用它。 - Agoston Horvath

23

如果你有一个分隔符,但是你不知道它是否包含特殊字符,你可以使用以下方法:

String[] parts = Pattern.compile(separator, Pattern.LITERAL).split(text);

7
使用guava,您可以优雅且快速地实现它:
private static final Splitter RECORD_SPLITTER = Splitter.on(CharMatcher.anyOf("@^")).trimResults().omitEmptyStrings();

...

Iterator<String> splitLine = Iterables.skip(RECORD_SPLITTER.split(inputLine), 1).iterator();

show.setNextNr(splitLine.next());
show.setNextTitle(splitLine.next());
show.setNextDate(splitLine.next());

1
public static String[] split(String string, char separator) {
    int count = 1;
    for (int index = 0; index < string.length(); index++)
        if (string.charAt(index) == separator)
            count++;
    String parts[] = new String[count];
    int partIndex = 0;
    int startIndex = 0;
    for (int index = 0; index < string.length(); index++)
        if (string.charAt(index) == separator) {
            parts[partIndex++] = string.substring(startIndex, index);
            startIndex = index + 1;
        }
    parts[partIndex++] = string.substring(startIndex);
    return parts;
}

1
String input = "Latest Episode@04x22^Killing Your Number^May/15/2009";

//split will work for both @ and ^
String splitArr[] = input.split("[@\\^]");

/*The output will be,
 [Latest Episode, 04x22, Killing Your Number, May/15/2009]
*/
System.out.println(Arrays.asList(splitArr));

你能解释一下这个回答是如何解决问题的吗? - Ben
1
字符串可以基于多种条件进行拆分。在这里,我使用@和^来拆分一个字符串。它们都可以作为定界符,并将字符串拆分。 - Yogi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接