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