Как разбить строку "Thequickbrownfoxjumps"
на подстроки равного размера в Java. Например. "Thequickbrownfoxjumps"
4 одинаковых размера должны дать результат.
["Theq","uick","brow","nfox","jump","s"]
Аналогичный вопрос:
Как разбить строку "Thequickbrownfoxjumps"
на подстроки равного размера в Java. Например. "Thequickbrownfoxjumps"
4 одинаковых размера должны дать результат.
["Theq","uick","brow","nfox","jump","s"]
Аналогичный вопрос:
Ответы:
Вот однострочная версия регулярного выражения:
\G
- это утверждение нулевой ширины, соответствующее позиции, в которой закончилось предыдущее совпадение. Если не было никакого предыдущего матча, он совпадает с началом ввода, так же , как\A
. Обращение назад соответствует позиции, которая находится на четыре символа от конца последнего совпадения.Обе функции lookbehind и
\G
расширенные функции регулярных выражений поддерживаются не всеми разновидностями. Кроме того,\G
он не реализован последовательно во всех разновидностях, которые его поддерживают. Этот трюк будет работать (например) в Java , Perl, .NET и JGSoft, но не в PHP (PCRE), Ruby 1.9+ или TextMate (оба Oniguruma). JavaScript/y
(липкий флаг) не такой гибкий\G
и не может использоваться таким образом, даже если JS действительно поддерживает поиск назад.Следует упомянуть, что я не обязательно рекомендую это решение, если у вас есть другие варианты. Решения без регулярных выражений в других ответах могут быть длиннее, но они также самодокументируются; этот как раз противоположный этому. ;)
Кроме того, это не работает в Android, который не поддерживает использование
\G
ретроспективного просмотра.источник
String.substring()
вместо регулярного выражения, хотя и требует нескольких дополнительных строк кода, будет работать где-то в 5 раз быстрее ...(?s)
в регулярном выражении:(?s)(?<=\\G.{4})
.java.util.regex.PatternSyntaxException: Look-behind pattern matches must have a bounded maximum length
Что ж, это довольно легко сделать с помощью простых арифметических и строковых операций:
Я не думаю, что для этого действительно стоит использовать регулярное выражение.
РЕДАКТИРОВАТЬ: Мои доводы в пользу отказа от регулярного выражения:
источник
Splitter.fixedLength(4)
как это было предложено seanizer.С Google Guava это очень просто :
Вывод:
Или, если вам нужен результат в виде массива, вы можете использовать этот код:
Ссылка:
Splitter.fixedLength()
Splitter.split()
Iterables.toArray()
Примечание. Конструкция сплиттера показана в строке выше, но поскольку сплиттеры неизменяемы и могут использоваться повторно, рекомендуется хранить их в константах:
источник
String.join(separator, arrayOrCollection)
Если вы используете универсальные библиотеки Google guava (и, честно говоря, любой новый Java-проект, вероятно, должен быть), это безумно тривиально с классом Splitter :
вот и все . Легко как!
источник
источник
src.length()
иlen
оба являютсяint
s, ваш вызовceiling
не выполняет то, что вы хотите - проверьте, как это делают некоторые другие ответы: (src.length () + len - 1) / lenисточник
for
петель?for
Цикл действительно является более «естественным» использование выбора для этого :-) Спасибо за указание на это.Вы можете использовать
substring
fromString.class
(обработка исключений) или из Apache lang commons (он обрабатывает исключения за вас)Поместите его в петлю, и все готово.
источник
substring
методом в стандартномString
классе?Я бы предпочел это простое решение:
источник
substring
реализации изменилось с Java 7, обновления 6 в середине 2012 года, когдаoffset
иcount
поля были удалены изString
класса. Таким образом, сложностьsubstring
превратилась в линейную задолго до того, как был дан ответ. Но для небольшой строки, такой как в примере, она по-прежнему выполняется достаточно быстро, а для более длинных строк ... ну, на практике эта задача встречается редко.Вот однострочная реализация с использованием потоков Java8:
Это дает следующий результат:
источник
String[] result = IntStream.range(0, (input.length()+3)/4) .mapToObj(i -> input.substring(i *= 4, Math.min(i + 4, input.length()))) .toArray(String[]::new);
Вот однострочная версия, которая использует Java 8 IntStream для определения индексов начала среза:
источник
В случае , если вы хотите , чтобы разбить строку в равной степени в обратном направлении, то есть справа налево, например, разделить
1010001111
на[10, 1000, 1111]
, вот код:источник
Я использую следующее решение java 8:
источник
Решение для Java 8 (как это, но немного проще):
источник
Я спросил @Alan Moore в комментарии к принятому решению, как можно обрабатывать строки с новой строкой. Он предложил использовать ДОТАЛЛ.
Используя его предложение, я создал небольшой пример того, как это работает:
Но мне также нравится решение @Jon Skeets в https://stackoverflow.com/a/3760193/1237974 . Для удобства обслуживания в более крупных проектах, где не все одинаково знакомы с регулярными выражениями, я бы, вероятно, использовал решение Jons.
источник
Еще одно решение для грубой силы:
Где код просто перебирает строку с подстроками
источник
результат
источник
источник
Вот моя версия, основанная на потоках RegEx и Java 8. Стоит отметить, что этот
Matcher.results()
метод доступен начиная с Java 9.Тест включен.
источник
источник
источник