split() по строковому литералу без удаления разделителя

227
25 сентября 2021, 18:40

Пробую найти правильное регулярное выражение, никак не выходит.

Пример:

("текст1 текст2 'текст3 текст4' текст5 'текст6' текст7").split(<regexp>)

Необходимый результат:

[ "текст1 текст2 ", "'текст3 текст4'", " текст5 ", "'текст6'", " текст7"]

В тории должно было помочь выражение на подобии "(?='.*')|(?<='.*')", но вторая часть жалуется на невозможность использования звёздочки.

Answer 1

Используйте

public static String[] splitIncludingDelimiters(String regex, String text) {
    List<String> list = new LinkedList<>();
    Matcher matcher = Pattern.compile(regex).matcher(text);
    int strt = 0;
    while(matcher.find()){
        list.add( text.substring(strt, matcher.start()) );
        list.add(matcher.group());
        strt = matcher.end();
    }
    if (strt < text.length()) list.add( text.substring(strt) );
    return list.toArray(new String[list.size()]);
}

Пример использования:

String s = "текст1 текст2 'текст3 текст4' текст5 'текст6' текст7";
String regex = "'[^']*'";
for (String l : splitIncludingDelimiters(regex, s)) {
   System.out.println(l);
}

Результат:

текст1 текст2 
'текст3 текст4'
 текст5 
'текст6'
 текст7
Answer 2

Можно и без регулярок, обычным циклом

public static void main(String[] args) {
    System.out.printf(Split("текст1 текст2 'текст3 текст4' текст5 'текст6' текст7").toString());
}
static List<String> Split(String inp){
    List<String> ret = new ArrayList<>();
    int ind = 0;
    while (ind < inp.length())
    {
        int start = ind;
        while (ind < inp.length() && inp.charAt(ind)!= '\'') ind++;
        ret.add(inp.substring(start, ind));
        start = ind;
        ind++;
        if (ind >= inp.length()) return ret;
        while (ind < inp.length() && inp.charAt(ind)!= '\'') ind++;
        ret.add(inp.substring(start, Math.min(ind + 1, inp.length())));
        ind++;
    }
    return ret;
}

Вывод

[текст1 текст2 , 'текст3 текст4',  текст5 , 'текст6',  текст7]
READ ALSO
Проблема с шифрованием

Проблема с шифрованием

Не получается выполнить задание, условие которого следующее: ТРАНСПОЗИЦИЯ С ФИКСИРОВАННЫМ ПЕРИОДОМ: В этом случае сообщение делится на группы...

109
Использование нескольких баз БД в Spring Boot

Использование нескольких баз БД в Spring Boot

Вопрос такой: Как подключить несколько БД к Spring Boot?

151
LocalDate или Date

LocalDate или Date

Сколько бы примеров и полей с датами на Java я не видел, всегда (или почти всегда) используют класс DateПри этом, я думаю, всем известно, что класс...

112