Вопрос-ответ

How to split a String by space

Как разделить строку по пробелу

Мне нужно разделить мою строку пробелами. Для этого я попробовал:

str = "Hello I'm your String";
String[] splited = str.split(" ");

Но, похоже, это не работает.

Переведено автоматически
Ответ 1

То, что у вас есть, должно сработать. Однако, если предоставленные пробелы по умолчанию равны ... чему-то другому? Вы можете использовать регулярное выражение с пробелами:

str = "Hello I'm your String";
String[] splited = str.split("\\s+");

Это приведет к тому, что любое количество последовательных пробелов разделит вашу строку на токены.

Ответ 2

Хотя принятый ответ хорош, имейте в виду, что в конечном итоге вы получите начальную пустую строку, если ваша входная строка начинается с пробела. Например, с помощью:

String str = " Hello I'm your String";
String[] splitStr = str.split("\\s+");

Результатом будет:

splitStr[0] == "";
splitStr[1] == "Hello";
splitStr[2] == "I'm";
splitStr[3] == "Your";
splitStr[4] == "String";

Возможно, вам захочется обрезать строку перед ее разделением:

String str = " Hello I'm your String";
String[] splitStr = str.trim().split("\\s+");

[править]

В дополнение к trim предостережению, возможно, вам захочется рассмотреть неразрывный символ пробела в юникоде (U+00A0). Этот символ печатается точно так же, как обычный пробел в строке, и часто скрывается в скопированном тексте из редакторов расширенного текста или веб-страниц. Они не обрабатываются .trim() какими тестами на удаление символов, используемыми для их удаления c <= ' '; \s также не будут их перехватывать.

Вместо этого вы можете использовать \p{Blank} но вам также нужно включить поддержку символов Unicode, чего не сделает обычный split. Например, это сработает: Pattern.compile("\\p{Blank}", UNICODE_CHARACTER_CLASS).split(words) но это не выполнит trim часть.

Следующее демонстрирует проблему и предлагает решение. Для этого далеко от оптимального полагаться на регулярное выражение, но теперь, когда Java имеет 8-битное / 16-битное представление, эффективное решение для этого становится довольно длинным.

public class SplitStringTest {
static final Pattern TRIM_UNICODE_PATTERN = Pattern.compile("^\\p{Blank}*(.*)\\p{Blank}*$", UNICODE_CHARACTER_CLASS);
static final Pattern SPLIT_SPACE_UNICODE_PATTERN = Pattern.compile("\\p{Blank}+", UNICODE_CHARACTER_CLASS);

public static String[] trimSplitUnicodeBySpace(String str) {
Matcher trimMatcher = TRIM_UNICODE_PATTERN.matcher(str);
boolean ignored = trimMatcher.matches();
return SPLIT_SPACE_UNICODE_PATTERN.split(trimMatcher.group(1));
}

@Test
public void test() {
String words = " Hello I'm\u00A0your String\u00A0";
// non-breaking space here --^ and there -----^

String[] split = words.split(" ");
String[] trimAndSplit = words.trim().split(" ");
String[] splitUnicode = SPLIT_SPACE_UNICODE_PATTERN.split(words);
String[] trimAndSplitUnicode = trimSplitUnicodeBySpace(words);

System.out.println("words: [" + words + "]");
System.out.println("split: [" + String.join("][", split) + "]");
System.out.println("trimAndSplit: [" + String.join("][", trimAndSplit) + "]");
System.out.println("splitUnicode: [" + String.join("][", splitUnicode) + "]");
System.out.println("trimAndSplitUnicode: [" + String.join("][", trimAndSplitUnicode) + "]");
}
}

Приводит к:

words: [ Hello    I'm your String ]
split: [][Hello][][][][I'm your][String ]
trimAndSplit: [Hello][][][][I'm your][String ]
splitUnicode: [][Hello][I'm][your][String]
trimAndSplitUnicode: [Hello][I'm][your][String]
Ответ 3

Я действительно считаю, что помещение регулярного выражения в круглые скобки str.split должно решить проблему. Метод Java String.split() основан на регулярных выражениях, поэтому вам нужно:

str = "Hello I'm your String";
String[] splitStr = str.split("\\s+");
Ответ 4

Используйте Stringutils.split() для разделения строки на белые интервалы. Например, StringUtils.split("Hello World") возвращает "Hello" и "World";

Для решения упомянутого случая мы используем метод разделения, подобный этому

String split[]= StringUtils.split("Hello I'm your String");

когда мы печатаем разделенный массив, на выходе будет :

Здравствуйте

I'm

ваш

Строка

Полный демонстрационный пример смотрите здесь

java string arrays