Перейти к основному содержимому

Разделить строку только при первом появлении разделителя

· 3 мин. чтения

1. Обзор

В этом руководстве мы узнаем, как разделить строку Java только при первом появлении разделителя, используя два подхода.

2. Постановка задачи

Допустим, у нас есть текстовый файл, в котором каждая строка представляет собой строку, состоящую из двух частей: левая часть указывает имя человека, а правая часть указывает его приветствие:

Roberto "I wish you a bug-free day!"
Daniele "Have a great day!"
Jonas "Good bye!"

Впоследствии мы хотим получить имя человека из каждой строки.

Мы видим, что обе части разделены « » (пробелом), как и другие слова в правой части. Итак, нашим разделителем будет символ пробела.

3. Использование метода split()

Метод экземпляра split() из класса String разбивает строку на основе предоставленного регулярного выражения. Более того, мы можем использовать один из его перегруженных вариантов, чтобы получить требуемое первое вхождение.

Мы можем указать ограничение в качестве параметра для метода split() , чтобы указать, сколько раз мы хотим применить шаблон и, следовательно, максимальное количество токенов в результирующем массиве. Например, если мы поставим ограничение как n ( n >0), это означает, что шаблон будет применен не более n-1 раз.

Здесь мы будем использовать пробел (" ") в качестве регулярного выражения для разделения строки при первом появлении пробела.

В результате мы можем разбить каждую строку на две части, используя перегруженный метод split() :

public String getFirstWordUsingSplit(String input) {
String[] tokens = input.split(" ", 2);
return tokens[0];
}

Итак, если мы передадим первую строку из нашего примера в качестве входных данных для этого метода, он вернет «Роберто».

Однако, если входная строка содержит только одно слово или в ней нет пробела, описанный выше метод просто вернет ту же самую строку .

Давайте проверим это:

assertEquals("Roberto", getFirstWordUsingSplit("Roberto \"I wish you a bug-free day\""));
assertEquals("StringWithNoSpace", getFirstWordUsingSplit("StringWithNoSpace"));

4. Использование метода подстроки()

Метод substring() класса String возвращает подстроку строки. Это перегруженный метод, где одна из перегруженных версий принимает индекс и возвращает все символы в строке до заданного индекса.

Давайте объединим substring() и indexOf() , чтобы решить ту же проблему .

Во-первых, мы получим индекс первого символа пробела. Затем мы получим подстроку до этого индекса, который будет нашим результатом, именем человека:

public String getFirstWordUsingSubString(String input) {
return input.substring(0, input.indexOf(" "));
}

Если мы передадим ту же входную строку , что и раньше, наш метод вернет строку «Роберто».

Однако, если входная строка не содержит пробелов, этот метод вызовет исключение StringIndexOutOfBoundsException . Если совпадение не найдено, метод indexOf() возвращает -1.

Чтобы избежать этого исключения, мы можем изменить вышеуказанный метод:

public String getFirstWordUsingSubString(String input) {
int index = input.contains(" ") ? input.indexOf(" ") : 0;
return input.substring(0, index);
}

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

Давайте проверим это:

assertEquals("Roberto", getFirstWordUsingSubString("Roberto \"I wish you a bug-free day\""));
assertEquals("", getFirstWordUsingSubString("StringWithNoSpace"));

5. Вывод

В этой статье мы рассмотрели два подхода к разбиению строки только при первом появлении разделителя в Java.

Как всегда, код доступен на GitHub .