Я могу разделить эту строку на ее части, используя String.split, но, похоже, я не могу получить фактическую строку, которая соответствовала регулярному выражению с разделителем.
Другими словами, это то, что я получаю:
Text1
Text2
Text3
Text4
Это то, что я хочу
Text1
DelimiterA
Text2
DelimiterC
Text3
DelimiterB
Text4
Есть ли какой-либо способ JDK разделить строку с помощью регулярного выражения-разделителя, но при этом сохранить разделители?
Переведено автоматически
Ответ 1
Вы можете использовать lookahead и lookbehind , которые являются функциями регулярных выражений.
((?<=;)|(?=;)) равно выделению пустого символа до ; или после ;.
РЕДАКТИРОВАТЬ: Комментарии Фабиана Стига по удобочитаемости верны. С регулярными выражениями всегда проблема с удобочитаемостью. Одна вещь, которую я делаю, чтобы сделать регулярные выражения более удобочитаемыми, - это создать переменную, имя которой отражает то, что делает регулярное выражение. Вы даже можете поместить заполнители (например, %1$s) и использовать Java String.format для замены заполнителей фактической строкой, которую вам нужно использовать; например:
// Split at the end of each run of letter dump("Boooyaaaah! Yippieeee!!".split("(?<=(?=(.)\\1(?!\\1))..)")); // "[Booo][yaaaa][h! Yipp][ieeee][!!]" } }
И да, в последнем шаблоне это утверждение с тройным вложением.
Очень наивным решением, которое не требует регулярного выражения, было бы выполнить замену строки в вашем разделителе в строках (предполагая, что разделитель заменен запятой):
string.replace(FullString, "," , "~,~")
Где вы можете заменить тильду (~) на соответствующий уникальный разделитель.
Тогда, если вы выполните разделение с вашим новым разделителем, я верю, что вы получите желаемый результат.
Stringtext= argv[1]; intcounter=1; for (String part : splitter.split(text)) { System.out.printf("Part %d: \"%s\"\n", counter++, part); } } }
/* Example: > java Splitter "\W+" "Hello World!" Part 1: "Hello" Part 2: " " Part 3: "World" Part 4: "!" Part 5: "" */
Мне не очень нравится другой способ, когда вы получаете пустой элемент спереди и сзади. Разделитель обычно не находится ни в начале, ни в конце строки, таким образом, вы чаще всего теряете два хороших слота массива.