19

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

13

Я хочу разделить строку, используя разделитель. Например, мне нужно разделить строку "004-034556" на две отдельные строки по разделителю "-":

part1 = "004";
part2 = "034556";

Это означает, что первая строка будет содержать символы до '-', а вторая строка будет содержать символы после '-'.

Кроме того, я хотел бы проверить, содержит ли строка разделитель ('-') в себе.

5 ответ(ов)

0

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

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+)           // Первая часть состоит ровно из двух заглавных букв,
                           // вторая состоит из цифр
0

Вы можете использовать следующий код для разделения строки:

String[] out = string.split("-");

Этот метод split класса String позволяет разделить строку на массив подстрок по указанному разделителю (в данном случае — это символ "-"). Класс String обладает множеством методов для работы со строками, так что вы сможете найти другие полезные функции по своему усмотрению.

0

Этот код демонстрирует, как использовать класс 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().

0

С помощью Java 8 вы можете разбить строку по разделителю и собрать результаты в список следующим образом:

List<String> stringList = Pattern.compile("-") // Компилируем регулярное выражение для разделителя "-"
        .splitAsStream("004-034556") // Разбиваем строку на потоке по этому разделителю
        .collect(Collectors.toList()); // Собираем результат в список

stringList.forEach(s -> System.out.println(s)); // Выводим каждый элемент списка на экран

Этот код создаёт список строк, где каждая строка является частью исходной строки, разделённой тире. В данном случае итоговый список будет содержать две строки: "004" и "034556". Затем мы используем метод forEach, чтобы вывести каждую из этих строк на экран.

0

Требования оставляют место для интерпретации. Я рекомендую написать метод:

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], или это ошибка? И так далее.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь