1. Обзор
В этом уроке мы собираемся пролить свет на то, как разбить строку на каждые n
символов в Java .
Во-первых, мы начнем с изучения возможных способов сделать это с помощью встроенных методов Java. Затем мы собираемся продемонстрировать, как достичь той же цели с помощью Guava.
2. Использование метода String#split
Класс String
поставляется с удобным методом, называемым split .
Как следует из названия ,
он разбивает строку на несколько частей на основе заданного разделителя или регулярного выражения.
Давайте посмотрим на это в действии:
public static List<String> usingSplitMethod(String text, int n) {
String[] results = text.split("(?<=\\G.{" + n + "})");
return Arrays.asList(results);
}
Как видим, мы использовали регулярное выражение (?<=\\G.{" + n + "})
, где n
— количество символов. Это положительное ретроспективное утверждение , которое соответствует строке, в которой последнее совпадение (\G)
сопровождается n
символами .
Теперь давайте создадим тестовый пример, чтобы убедиться, что все работает так, как ожидалось:
public class SplitStringEveryNthCharUnitTest {
public static final String TEXT = "abcdefgh123456";
@Test
public void givenString_whenUsingSplit_thenSplit() {
List<String> results = SplitStringEveryNthChar.usingSplitMethod(TEXT, 3);
assertThat(results, contains("abc", "def", "gh1", "234", "56"));
}
}
3. Использование метода String#substring
Другой способ разделить объект String
по каждому n-му символу — использовать метод подстроки
.
По сути, мы можем перебрать строку и вызвать подстроку
, чтобы разделить ее на несколько частей на основе указанных n
символов:
public static List<String> usingSubstringMethod(String text, int n) {
List<String> results = new ArrayList<>();
int length = text.length();
for (int i = 0; i < length; i += n) {
results.add(text.substring(i, Math.min(length, i + n)));
}
return results;
}
Как показано выше, метод подстроки
позволяет нам получить часть строки между текущим индексом i
и i+n.
Теперь давайте подтвердим это с помощью тестового примера:
@Test
public void givenString_whenUsingSubstring_thenSplit() {
List<String> results = SplitStringEveryNthChar.usingSubstringMethod(TEXT, 4);
assertThat(results, contains("abcd", "efgh", "1234", "56"));
}
4. Использование класса Pattern
Pattern
предлагает краткий способ компиляции регулярного выражения и сопоставления его с заданной строкой.
Итак, с правильным регулярным выражением мы можем использовать Pattern
для достижения нашей цели:
public static List<String> usingPattern(String text, int n) {
return Pattern.compile(".{1," + n + "}")
.matcher(text)
.results()
.map(MatchResult::group)
.collect(Collectors.toList());
}
Как мы видим, мы использовали «.{1,n}»
в качестве регулярного выражения для создания нашего объекта Pattern
.
Он соответствует как минимум одному и не более чем n
символам.
Наконец, давайте напишем простой тест:
@Test
public void givenString_whenUsingPattern_thenSplit() {
List<String> results = SplitStringEveryNthChar.usingPattern(TEXT, 5);
assertThat(results, contains("abcde", "fgh12", "3456"));
}
5. Использование гуавы
Теперь, когда мы знаем, как разбить строку на каждые n
символов, используя базовые методы Java, давайте посмотрим, как сделать то же самое с помощью библиотеки Guava :
public static List<String> usingGuava(String text, int n) {
Iterable<String> parts = Splitter.fixedLength(n).split(text);
return ImmutableList.copyOf(parts);
}
Guava предоставляет класс Splitter
для упрощения логики извлечения подстрок из строки. Метод fixedLength()
разбивает заданную строку на части указанной длины .
Давайте проверим наш метод на тестовом примере:
@Test
public void givenString_whenUsingGuava_thenSplit() {
List<String> results = SplitStringEveryNthChar.usingGuava(TEXT, 6);
assertThat(results, contains("abcdef", "gh1234", "56"));
}
6. Заключение
Подводя итог, мы объяснили, как разделить строку по каждому n-му символу, используя методы Java.
После этого мы показали, как добиться той же цели, используя библиотеку Guava.
Как всегда, код, использованный в этой статье, можно найти на GitHub .