Подтвердить что ты не робот

Как разбить массив String?

Намерение состоит в том, чтобы взять текущую строку (String, которая содержит запятые), заменить пробел на "" (пространство Trim) и, наконец, сохранить в массив массивы String.

Почему это не работает?

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

Ответ 1

Я думаю, вы хотите replaceAll вместо замены.

И replaceAll("\\s","") удалит все пробелы, а не только лишние. Если это не то, что вы хотите, вы должны попробовать replaceAll("\\s+","\\s") или что-то в этом роде.

Ответ 2

В режимах regex vs non-regex

Класс String имеет следующие методы:

Итак, здесь мы видим непосредственную причину вашей проблемы: вы используете шаблон регулярного выражения в методе non-regex. Вместо replace вы хотите использовать replaceAll.

Другие распространенные ошибки включают:

  • split(".") (когда подразумевается буквальный период)
  • matches("pattern") - это целочисленное совпадение!
    • Нет contains("pattern"); используйте matches(".*pattern.*") вместо

В Guava 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"

Ответ 3

То, что вы написали, не соответствует коду:

Намерение состоит в том, чтобы взять текущую строку, содержащую запятые, сохранить обрезанные значения всего пространства и сохранить строку в массиве.

Он заставляет по коду вы хотите удалить все пробелы и разбить результирующую строку на запятую (не описано). Это можно сделать, как предложил Пол Томблин.

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

Если вы хотите разбить запятую и удалить верхние и конечные пробелы (обрезку) из полученных частей, используйте:

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

(trim() требуется для удаления ведущих пространств первой части и конечного пространства из последней части)

Ответ 4

Если вам нужно выполнить эту операцию несколько раз, я бы предложил вместо этого использовать 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 повторно не рекомендуется, так как каждый вызов включает компиляцию регулярного выражения с последующей заменой.