code: public static String[] splitPreserveAllTokens(final String str, final String separatorChars, final int max) {
          return splitWorker(str, separatorChars, max, true);
      }
docs: <p>Splits the provided text into an array with a maximum length,
  separators specified, preserving all tokens, including empty tokens
  created by adjacent separators.</p>
  
  <p>The separator is not included in the returned String array.
  Adjacent separators are treated as separators for empty tokens.
  Adjacent separators are treated as one separator.</p>
  
  <p>A {@code null} input String returns {@code null}.
  A {@code null} separatorChars splits on whitespace.</p>
  
  <p>If more than {@code max} delimited substrings are found, the last
  returned string includes all characters after the first {@code max - 1}
  returned strings (including separator characters).</p>
  
  <pre>
  StringUtils.splitPreserveAllTokens(null, *, *)            = null
  StringUtils.splitPreserveAllTokens("", *, *)              = []
  StringUtils.splitPreserveAllTokens("ab de fg", null, 0)   = ["ab", "cd", "ef"]
  StringUtils.splitPreserveAllTokens("ab   de fg", null, 0) = ["ab", "cd", "ef"]
  StringUtils.splitPreserveAllTokens("ab:cd:ef", ":", 0)    = ["ab", "cd", "ef"]
  StringUtils.splitPreserveAllTokens("ab:cd:ef", ":", 2)    = ["ab", "cd:ef"]
  StringUtils.splitPreserveAllTokens("ab   de fg", null, 2) = ["ab", "  de fg"]
  StringUtils.splitPreserveAllTokens("ab   de fg", null, 3) = ["ab", "", " de fg"]
  StringUtils.splitPreserveAllTokens("ab   de fg", null, 4) = ["ab", "", "", "de fg"]
  </pre>
  
  @param str  the String to parse, may be {@code null}
  @param separatorChars  the characters used as the delimiters,
  {@code null} splits on whitespace
  @param max  the maximum number of elements to include in the
  array. A zero or negative value implies no limit
  @return an array of parsed Strings, {@code null} if null String input
  @since 2.1