Как разделить строку в Java?
Я хочу разделить строку, используя разделитель. Например, мне нужно разделить строку "004-034556"
на две отдельные строки по разделителю "-"
:
part1 = "004";
part2 = "034556";
Это означает, что первая строка будет содержать символы до '-'
, а вторая строка будет содержать символы после '-'
.
Кроме того, я хотел бы проверить, содержит ли строка разделитель ('-'
) в себе.
5 ответ(ов)
Альтернативой прямой обработке строки будет использование регулярного выражения с захватывающими группами. Это имеет то преимущество, что позволяет легко накладывать более сложные ограничения на вводимые данные. Например, следующий код разбивает строку на две части и гарантирует, что обе состоят только из цифр:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
class SplitExample
{
private static Pattern twopart = Pattern.compile("(\\d+)-(\\d+)");
public static void checkString(String s)
{
Matcher m = twopart.matcher(s);
if (m.matches()) {
System.out.println(s + " соответствует; первая часть - " + m.group(1) +
", вторая часть - " + m.group(2) + ".");
} else {
System.out.println(s + " не соответствует.");
}
}
public static void main(String[] args) {
checkString("123-4567");
checkString("foo-bar");
checkString("123-");
checkString("-4567");
checkString("123-4567-890");
}
}
Поскольку шаблон фиксирован в данном случае, его можно скомпилировать заранее и хранить как статический член (инициализированный во время загрузки класса в примере). Регулярное выражение выглядит так:
(\d+)-(\d+)
Скобки обозначают захватывающие группы; строка, которая соответствует этой части регулярного выражения, может быть получена с помощью метода Match.group(), как показано выше. Символ \d
соответствует одной десятичной цифре, а +
означает "соответствовать одному или более предыдущим выражениям". Символ -
не имеет специального значения и просто сопоставляется с этим символом во вводе. Обратите внимание, что вам нужно двойное экранирование обратных слэшей при написании этого в виде строки Java. Вот некоторые другие примеры:
([A-Z]+)-([A-Z]+) // Каждая часть состоит только из заглавных букв
([^-]+)-([^-]+) // Каждая часть состоит из символов, отличных от -
([A-Z]{2})-(\d+) // Первая часть состоит ровно из двух заглавных букв,
// вторая состоит из цифр
Вы можете использовать следующий код для разделения строки:
String[] out = string.split("-");
Этот метод split
класса String
позволяет разделить строку на массив подстрок по указанному разделителю (в данном случае — это символ "-"). Класс String
обладает множеством методов для работы со строками, так что вы сможете найти другие полезные функции по своему усмотрению.
Этот код демонстрирует, как использовать класс StringTokenizer
для разделения строки на токены с учетом указанных разделителей. Примечание к коду гласит, что данный подход не учитывает проблему с регулярными выражениями, но стоит помнить, что каждый символ в строке разделителей воспринимается как отдельный разделитель.
Вот краткое объяснение функции SplitUsingTokenizer
:
public static String[] SplitUsingTokenizer(String subject, String delimiters) {
// Создаем экземпляр StringTokenizer, который будет разделять входную строку на токены
StringTokenizer strTkn = new StringTokenizer(subject, delimiters);
// Создаем список для хранения токенов
ArrayList<String> arrLis = new ArrayList<String>(subject.length());
// Пока есть токены, добавляем их в список
while(strTkn.hasMoreTokens())
arrLis.add(strTkn.nextToken());
// Возвращаем массив строк, созданный из списка
return arrLis.toArray(new String[0]);
}
Таким образом, функция принимает строку subject
и строку delimiters
, разбивает subject
на части по разделителям и возвращает массив строк. Обратите внимание, что если вам нужны более сложные правила разделения, возможно, вам стоит рассмотреть использование регулярных выражений и класс String.split()
.
С помощью Java 8 вы можете разбить строку по разделителю и собрать результаты в список следующим образом:
List<String> stringList = Pattern.compile("-") // Компилируем регулярное выражение для разделителя "-"
.splitAsStream("004-034556") // Разбиваем строку на потоке по этому разделителю
.collect(Collectors.toList()); // Собираем результат в список
stringList.forEach(s -> System.out.println(s)); // Выводим каждый элемент списка на экран
Этот код создаёт список строк, где каждая строка является частью исходной строки, разделённой тире. В данном случае итоговый список будет содержать две строки: "004" и "034556". Затем мы используем метод forEach
, чтобы вывести каждую из этих строк на экран.
Требования оставляют место для интерпретации. Я рекомендую написать метод:
public final static String[] mySplit(final String s)
который инкапсулирует эту функциональность. Конечно, вы также можете использовать String.split(..)
в реализации, как упоминали в других ответах.
Не забудьте написать несколько юнит-тестов для входных строк и ожидаемых результатов и поведения.
Хорошие кандидаты для тестирования могут включать:
- "0022-3333"
- "-"
- "5555-"
- "-333"
- "3344-"
- "--"
- ""
- "553535"
- "333-333-33"
- "222--222"
- "222--"
- "--4555"
Определив соответствующие ожидаемые результаты, вы сможете задать поведение.
Например, если входная строка "-333"
должна возвращать [,333]
или это ошибка? Может ли строка "333-333-33"
быть разделена на [333, 333-33]
или на [333-333, 33]
, или это ошибка? И так далее.
Как преобразовать строку в int в Java?
Преобразование 'ArrayList<String>' в 'String[]' в Java
Как сгенерировать случайную алфавитно-цифровую строку
Как преобразовать строку, разделённую запятыми, в массив?
Как преобразовать int в String?