Намерение состоит в том, чтобы проводить текущую строку (Строка, которая содержит запятые), пробел замены с, "" (Пространство для обрезки), и наконец сохраните Строковые элементы разделения в массив.
Почему это не работает?
String[] textLine = currentInputLine.replace("\\s", "").split(",");
Я думаю, вам нужно заменить все, а не заменить.
И replaceAll ("\\ s", "")
удалит все пробелы, а не только лишние. Если это не то, что вам нужно, попробуйте replaceAll ("\\ s +", "\\ s")
или что-то в этом роде.
То, что вы написали, не соответствует коду:
Намерение состоит в том, чтобы взять текущую строку, содержащую запятые, сохранить обрезанные значения всего пространства и сохранить строку в массиве.
Судя по коду, вы хотите удалить все пробелы и разделить полученную строку запятыми (не описано). Это можно сделать, как предложил Пол Томблин.
String[] currentLineArray = currentInputLine.replaceAll("\\s", "").split(",");
Если вы хотите разделить запятые и удалить начальные и конечные пробелы (обрезать) из результирующих частей, используйте:
String[] currentLineArray = currentInputLine.trim().split("\\s*,\\s*");
( trim ()
необходимо для удаления начальных пробелов первых ] часть и конечный пробел из последней части )
Класс String
имеет следующие методы:
Итак, здесь мы видим непосредственную причину вашей проблемы: вы используете шаблон regex в нерегексовом методе. Вместо replace
вы хотите использовать replaceAll
.
Другие распространенные ловушки:
split(".")
(когда подразумевается буквальная точка)matches("pattern")
- это целоестроковое соответствие!
contains("pattern")
; используйте matches(".*pattern.*")
вместо этогоSplitter от Guava
В зависимости от ваших потребностей, комбо String.replaceAll
и split
может справиться с этой задачей. Однако более специализированным инструментом для этой цели является Splitter
от Guava.
Вот пример, показывающий разницу:
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
определенно более читабельно и просто в использовании.
В Guava также есть (среди многих других замечательных вещей) очень удобный Joiner
.
System.out.println(
Joiner.on("... ").skipNulls().join("Oh", "My", null, "God")
);
// prints "Oh... My... God"