code: public static String uncapitalize(final String str, final char... delimiters) {
          final int delimLen = delimiters == null ? -1 : delimiters.length;
          if (StringUtils.isEmpty(str) || delimLen == 0) {
              return str;
          }
          final char[] buffer = str.toCharArray();
          boolean uncapitalizeNext = true;
          for (int i = 0; i < buffer.length; i++) {
              final char ch = buffer[i];
              if (isDelimiter(ch, delimiters)) {
                  uncapitalizeNext = true;
              } else if (uncapitalizeNext) {
                  buffer[i] = Character.toLowerCase(ch);
                  uncapitalizeNext = false;
              }
          }
          return new String(buffer);
      }
docs: <p>Uncapitalizes all the whitespace separated words in a String.
  Only the first character of each word is changed.</p>
  
  <p>The delimiters represent a set of characters understood to separate words.
  The first string character and the first non-delimiter character after a
  delimiter will be uncapitalized. </p>
  
  <p>Whitespace is defined by {@link Character#isWhitespace(char)}.
  A <code>null</code> input String returns <code>null</code>.</p>
  
  <pre>
  WordUtils.uncapitalize(null, *)            = null
  WordUtils.uncapitalize("", *)              = ""
  WordUtils.uncapitalize(*, null)            = *
  WordUtils.uncapitalize(*, new char[0])     = *
  WordUtils.uncapitalize("I AM.FINE", {'.'}) = "i AM.fINE"
  </pre>
  
  @param str  the String to uncapitalize, may be null
  @param delimiters  set of characters to determine uncapitalization, null means whitespace
  @return uncapitalized String, <code>null</code> if null String input
  @see #capitalize(String)
  @since 2.1