Use ^(.{2})(.{2})(.{3})(.{2}).* (See it in action in regex101) to group the String to the specified length and grab the groups as separate Strings
  String input = "123456789";
  List<String> output = new ArrayList<>();
  Pattern pattern = Pattern.compile("^(.{2})(.{2})(.{3})(.{2}).*");
  Matcher matcher = pattern.matcher(input);
  if (matcher.matches()) {
     for (int i = 1; i <= matcher.groupCount(); i++) {
         output.add(matcher.group(i));
     }
  }
  System.out.println(output);
NOTE: Group capturing starts from 1 as the group 0 matches the whole String
And a Magnificent Sorcery from @YCF_L from comment
  String pattern = "^(.{2})(.{2})(.{3})(.{2}).*";
  String[] vals = "123456789".replaceAll(pattern, "$1-$2-$3-$4").split("-");
Whats the magic here is you can replace the captured group by replaceAll() method. Use $n (where n is a digit) to refer to captured subsequences. See this stackoverflow question for better explanation.
NOTE: here its assumed that no input string contains - in it.
 if so, then find any other character that will not be in any of
 your input strings so that it can be used as a delimiter.