意图是获取当前行(包含逗号的字符串),用“”(修剪空格)替换空格,最后将拆分的String元素存储到数组中。
为什么这不起作用?
String[] textLine = currentInputLine.replace("\\s", "").split(",");
答案 0 :(得分:10)
String
类有以下方法:
因此,我们在此处看到问题的直接原因:您在非正则表达式方法中使用正则表达式模式。您需要使用replace
。
replaceAll
其他常见的陷阱包括:
split(".")
(当表示文字句点时)matches("pattern")
是一个整个 - 字符串匹配!
contains("pattern")
;使用matches(".*pattern.*")
代替Splitter
根据您的需要,String.replaceAll
和split
组合可以充分发挥作用。然而,用于此目的的更专业的工具是来自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.Pattern
和java.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,因为每次调用都涉及编译正则表达式,然后进行替换。