如何拆分String数组?

Jam*_*sev 12 java regex arrays string split

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

为什么这不起作用?

String[] textLine = currentInputLine.replace("\\s", "").split(",");
Run Code Online (Sandbox Code Playgroud)

pol*_*nts 10

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

String班有以下方法:

因此,我们在这里看到问题的直接原因:您在非正则表达式方法中使用正则表达式模式.而不是replace,你想使用replaceAll.

其他常见的陷阱包括:

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

关于番石榴 Splitter

根据您的需求,String.replaceAllsplit组合可以充分地完成这项工作.然而,用于此目的的更专业的工具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();       
}
Run Code Online (Sandbox Code Playgroud)

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

番石榴也有(很多其他很棒的东西)非常方便Joiner.

System.out.println(
    Joiner.on("... ").skipNulls().join("Oh", "My", null, "God")
);
// prints "Oh... My... God"
Run Code Online (Sandbox Code Playgroud)


Pau*_*lin 6

我想你想要replaceAll而不是替换.

replaceAll("\\s","")会删除所有空格,不只是多余的.如果这不是你想要的,你应该尝试replaceAll("\\s+","\\s")或类似的东西.