Пробую найти правильное регулярное выражение, никак не выходит.
Пример:
("текст1 текст2 'текст3 текст4' текст5 'текст6' текст7").split(<regexp>)
Необходимый результат:
[ "текст1 текст2 ", "'текст3 текст4'", " текст5 ", "'текст6'", " текст7"]
В тории должно было помочь выражение на подобии "(?='.*')|(?<='.*')", но вторая часть жалуется на невозможность использования звёздочки.
Используйте
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
Можно и без регулярок, обычным циклом
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]
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости