Как я мог разбить строку на несколько подстрок, где каждая подстрока содержит равные конечные символы? Такой как:
hello -> h, e, ll, o
helel -> h, e, l, e, l
> каждая подстрока содержит одинаковые конечные символы, ожидая, что на это ответят крутые потоки Java
Если есть несколько символов одного и того же значения, следующих друг за другом (рядом друг с другом в строке), то они становятся новой строкой. Следовательно, во втором примере две буквы L становятся двумя отдельными подстроками.
Не самый элегантный способ, но вы можете использовать регулярное выражение, например (?:(.)(\1))|.. Демо
@Thefourthbird Разрешены ли группы захвата в поисках Java? Я не мог заставить его работать. Может быть, тебе стоит опубликовать ответ.
@TimBiegeleisen Для группировки (.)(\1) используется не поисковая, а не захватывающая группа.
Опять же, опубликуйте код Java. Я понимаю, что вы пытаетесь сказать, но заставить его работать на Java - это совсем другая история ;-)




Я не мог думать об одном однострочном регулярном выражении здесь, но если вы открыты для двухэтапного решения, тогда мы можем сделать замену регулярного выражения с последующим разделением по пространству:
String input = "hello";
input = input.replaceAll("(\\w)(?!\\1)", "$1 ");
System.out.println(Arrays.toString(input.split(" ")));
input = "helel";
input = input.replaceAll("(\\w)(?!\\1)", "$1 ");
System.out.println(Arrays.toString(input.split(" ")));
[h, e, ll, o]
[h, e, l, e, l]
Хитрость здесь в том, что мы добавляем разделитель пробелов перед каждым символом, то есть нет, сразу за которым следует тот же символ. Таким образом, ll в hello остается смежным, потому что в этом случае утверждение опережающего просмотра потерпит неудачу.
Вы можете использовать Pattern и Matcher так:
String text = "hello";
String regex = "(.)\\1*";
Matcher matcher = Pattern.compile(regex).matcher(text);
List<String> result = new ArrayList<>();
while (matcher.find()) {
result.add(matcher.group());
}
System.out.println(result);
Если вы используете Java 9+, вы можете использовать:
String text = "hello";
String regex = "(.)\\1*";
List<String> result = Pattern.compile(regex).matcher(text).results()
.map(MatchResult::group)
.collect(Collectors.toList());
Выходы
[h, e, ll, o]
По какой логике
helloстановитсяh e ll o?