Вступление
Часто мы сталкиваемся с ситуацией, когда нам нужно разделить строку на определенный символ или подстроку, чтобы извлечь из нее полезную информацию.
Например, мы можем разделить номер телефона на код страны или данные, импортированные из файла CSV.
В этой статье мы расскажем, как разбить строку в Java.
Метод split () (без ограничений)
Этот метод принимает один String
в формате регулярного выражения
(regex). Этот метод разбивает строку вокруг совпадений с заданным
регулярным выражением.
Синтаксис этого метода:
String[] split(String regex, int limit)
Где regex
представляет собой разделитель, то есть в зависимости от
того, что мы разделим нашу строку. Имейте в виду, что этот параметр не
должен быть чем-то сложным, Java просто предоставляет возможность
использования регулярных выражений.
Например, давайте посмотрим, как мы можем разделить эту строку на два отдельных имени:
String myString = "Jane-Doe";
String[] splitString = myString.split("-");
Мы можем просто использовать символ / подстроку вместо фактического регулярного выражения. Конечно, в регулярном выражении есть определенные специальные символы, о которых нам нужно помнить и избегать их, если нам нужно их буквальное значение.
После разделения строки результат возвращается в виде массива строк. Строки в возвращаемом массиве появляются в том же порядке, что и в исходной строке.
Результаты упаковываются в массив String. Чтобы получить отдельные имена, мы можем получить доступ к каждому элементу:
System.out.println(splitString[0]);
System.out.println(splitString[1]);
Это приводит к:
Jane
Doe
Имейте в виду, что этот метод разделит строку на все вхождения разделителя. Например, у нас может быть вход в формате CSV:
String myString = "Jane,21,Employed,Software Engineer";
String[] splitString = myString.split(",");
for (String s : splitString) {
System.out.println(s);
}
Это приводит к:
Jane
21
Employed
Software Engineer
Метод Java split () (с ограничением)
Здесь метод принимает два параметра, один из которых является ранее
обсужденным regex
, а другой - целочисленным значением, обозначающим
limit
. Параметр limit
используется, чтобы решить, сколько раз мы
хотим разделить строку.
Параметр limit
может принимать одну из трех форм, т. Е. Он может быть
больше, меньше или больше нуля. Давайте посмотрим, что представляет
собой каждая из этих ситуаций:
- Положительный
limit
-String
будет разделена до максимальногоlimit - 1
раз. Помимо этого, остальная часть строки будет возвращена как последний элемент массива, как есть, без разделения. Длина возвращаемого массива всегда будет меньше или равнаlimit
. - Отрицательный
limit
-String
разделяется по разделителю столько раз, сколько возможно, игнорируя конкретный набор отрицательных значений. Подстроки в массиве включают конечные пробелы в исходной строке, если они есть. - Когда
limit
установлен на0
-String
снова разделяется столько раз, сколько возможно, и нет ограничения на длину результирующего массива. Он работает так же, как вызовsplit()
с регулярным выражением в качестве единственного аргумента, как было показано ранее. В этом случае конечные пробелы не возвращаются.
Положительное предельное значение
Давайте рассмотрим несколько примеров использования разных лимитов.
Во-первых, положительное limit
значение:
String myString = "there,,are,more,than,three,commas,,,";
String [] splitStrings = myString.split(",", 4);
for(String string : splitStrings){
System.out.println(String.format(" \" %s \"", string));
}
При ограничении в 4 String
будет разделена не более трех ( limit - 1
) раз. Это дает нам массив с четырьмя элементами (0..3), последним
элементом является все, что находится после третьего разделения:
"there"
""
"are"
"more,than,three,commas,,,"
Если бы мы использовали отрицательный limit
для этой же String:
String myString = "there,,are,more,than,three,commas,,,";
String [] splitStrings = myString.split(",", -1);
for(String string : splitStrings){
System.out.println(String.format(" \" %s \"", string));
}
String
будет разделена столько раз, сколько возможно, а завершающие
пустые строки будут добавлены в массив:
"there"
""
"are"
"more"
"than"
"three"
"commas"
""
""
""
Фактическое отрицательное значение, которое мы использовали, не
принимается во внимание, мы бы получили тот же результат, если бы
использовали -150
.
Если мы установим limit
на 0
, строка снова будет разделена столько
раз, сколько возможно, но результирующий массив не будет содержать
конечных пустых пробелов:
String myString = "there,,are,more,than,three,commas,,,";
// Equivalent to calling the split() method with only the regex parameter
String [] splitStrings = myString.split(",", 0);
for(String string : splitStrings){
System.out.println(String.format(" \" %s \"", string));
}
Это даст нам:
"there"
""
"are"
"more"
"than"
"three"
"commas"
Примечание о специальных символах
Как мы упоминали ранее, regex
переданный в качестве разделителя в
split()
является регулярным выражением. Мы должны обязательно
экранировать специальные символы, если мы хотим использовать их
буквальное значение в качестве разделителя. Например, *
означает «один
или несколько экземпляров следующего символа (ов)».
В регулярном выражении 12 таких символов. К ним относятся: \
, ^
,
$
, .
, |
, ?
, *
, +
, (
, )
, [
, {
. Вы можете
увидеть их значение в регулярном выражении
здесь%2C%20the)
.
Если мы хотим разбить String
по одному из этих символов, необходимо
соблюдать особую осторожность, чтобы экранировать эти символы в
параметрах метода. Один из способов использовать это - использовать
обратную косую черту \
. Например:
string.split("\\|");
Разделяет string
переменной на |
персонаж. Здесь мы используем две
обратной косой черты, так как нам нужно сначала избежать Java-значения
обратной косой черты, поэтому обратная косая черта может быть применена
к |
персонаж.
Вместо этого мы можем использовать набор символов регулярного выражения.
Это относится к помещению специальных символов, которые нужно
экранировать, в квадратных скобках. Таким образом, специальные символы
обрабатываются как обычные символы. Например, мы могли бы использовать
|
в качестве разделителя, сказав:
string.split("[|]");
Еще один способ избежать специальных символов - использовать
Pattern.quote()
:
string.split(Pattern.quote("|"));
Заключение
Метод split()
класса Java String
- очень полезный и часто
используемый инструмент. Большинство данных, особенно полученные при
чтении файлов, потребуют некоторой предварительной обработки, такой как
разделение строки, чтобы получить из нее значимую информацию.
В этой статье мы рассмотрели, как разбивать строки в Java.