Вы можете использовать просмотр вперед и просмотр назад, которые являются функциями регулярных выражений.
Вы даже можете поместить плейсхолдеры, например
%1$s
и использовать
String.format
для замены плейсхолдеров на фактическую строку, которую вам нужно использовать.
Простое решение для Java 8 и новее:
public class Main {
public static final String DELIMITER = "((?<=%1$s)|(?=%1$s))";
public static void main(String[] args) {
String task = "Заменить, в тексте все! слова длиной? не больше 6 символов; в обратном порядке начинающиеся на: согласную букву ";
String[] arr = task.split(String.format(DELIMITER, "[:?;!. ]"));
String result = Arrays.stream(arr)
.map(s -> !check(s.charAt(0)) && !length(s) ? reverse(s) : s)
.collect(Collectors.joining());
System.out.println(result); /* Заменить, в етскет есв! аволс йонилд? ен ешьлоб 6 символов; в обратном порядке начинающиеся ан: согласную увкуб */
}
public static boolean check(char c) {
return "аиеёоуыэюя".indexOf(c) > -1;
}
public static boolean length(String s) {
return s.length() > 6;
}
public static String reverse(String s) {
return new StringBuilder(s).reverse().toString();
}
}