如何拆分String数组?

时间:2010-06-14 02:50:26

标签: java regex arrays string split

意图是获取当前行(包含逗号的字符串),用“”(修剪空格)替换空格,最后将拆分的String元素存储到数组中。

为什么这不起作用?

String[] textLine = currentInputLine.replace("\\s", "").split(",");

4 个答案:

答案 0 :(得分:10)

关于正则表达式与非正则表达式方法

String类有以下方法:

因此,我们在此处看到问题的直接原因:您在非正则表达式方法中使用正则表达式模式。您需要使用replace

而不是replaceAll

其他常见的陷阱包括:

  • split(".")(当表示文字句点时)
  • matches("pattern")是一个整个 - 字符串匹配!
    • 没有contains("pattern");使用matches(".*pattern.*")代替

关于番石榴的Splitter

根据您的需要,String.replaceAllsplit组合可以充分发挥作用。然而,用于此目的的更专业的工具是来自Guava的Splitter

以下是显示差异的示例:

public static void main(String[] args) {
    String text = "  one, two, , five (three sir!) ";

    dump(text.replaceAll("\\s", "").split(","));
    // prints "[one] [two] [] [five(threesir!)] "

    dump(Splitter.on(",").trimResults().omitEmptyStrings().split(text));
    // prints "[one] [two] [five (three sir!)] "
}

static void dump(String... ss) {
    dump(Arrays.asList(ss));
}
static void dump(Iterable<String> ss) {
    for (String s : ss) {
        System.out.printf("[%s] ", s);
    }
    System.out.println();       
}

请注意,String.split不能在返回的数组的开头/中间省略空字符串。它只能省略尾随空字符串。另请注意,replaceAll可能会过度“修剪”空格。 可以使正则表达式更复杂,因此它只会在分隔符周围修剪,但Splitter解决方案肯定更易读,更易于使用。

番石榴还有很多其他很棒的东西Joiner

System.out.println(
    Joiner.on("... ").skipNulls().join("Oh", "My", null, "God")
);
// prints "Oh... My... God"

答案 1 :(得分:6)

我认为你想要replaceAll而不是替换。

replaceAll("\\s","")将删除所有空格,而不仅仅是冗余空格。如果那不是您想要的,您应该尝试replaceAll("\\s+","\\s")或类似的东西。

答案 2 :(得分:2)

您所写的内容与代码不符:

  

意图是获取包含逗号的当前行,存储所有空格的修剪值并将该行存储到数组中。

根据代码,您希望删除所有空格并将结果字符串拆分为逗号(未描述)。这可以像Paul Tomblin建议的那样完成。

String[] currentLineArray = currentInputLine.replaceAll("\\s", "").split(",");

如果要分割逗号并从结果部分中删除前导和尾随空格(修剪),请使用:

String[] currentLineArray = currentInputLine.trim().split("\\s*,\\s*");

trim()需要删除第一个部分的前导空格和最后部分的尾随空格

答案 3 :(得分:0)

如果您需要重复执行此操作,我建议您改用java.util.regex.Patternjava.util.regex.Matcher

final Pattern pattern = Pattern.compile( regex);
for(String inp: inps) {
    final Matcher matcher = pattern.matcher( inpString);
    return matcher.replaceAll( replacementString); 
}

编译正则表达式是一项代价高昂的操作,不建议重复使用String的replaceAll,因为每次调用都涉及编译正则表达式,然后进行替换。