Как разделить Массив строк?

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

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

String[] textLine = currentInputLine.replace("\\s", "").split(",");
12
задан James Raitsev 11 October 2011 в 14:36
поделиться

3 ответа

Я думаю, вам нужно заменить все, а не заменить.

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

6
ответ дан 2 December 2019 в 19:30
поделиться

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

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

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

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

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

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

( trim () необходимо для удаления начальных пробелов первых ] часть и конечный пробел из последней части )

2
ответ дан 2 December 2019 в 19:30
поделиться

О regex и не-regex методах

Класс 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"
10
ответ дан 2 December 2019 в 19:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: