code: static String[] splitOnTokens(String text)
      {
          // used by wildcardMatch
          // package level so a unit test may run on this
  
          if (text.indexOf('?') == -1 && text.indexOf('*') == -1)
          {
              return new String[]
                      {
                          text
                      };
          }
  
          char[] array = text.toCharArray();
          ArrayList<String> list = new ArrayList<String>();
          StringBuilder buffer = new StringBuilder();
          for (int i = 0; i < array.length; i++)
          {
              if (array[i] == '?' || array[i] == '*')
              {
                  if (buffer.length() != 0)
                  {
                      list.add(buffer.toString());
                      buffer.setLength(0);
                  }
                  if (array[i] == '?')
                  {
                      list.add("?");
                  }
                  else if (list.isEmpty()
                          || i > 0 && list.get(list.size() - 1).equals("*") == false)
                  {
                      list.add("*");
                  }
              }
              else
              {
                  buffer.append(array[i]);
              }
          }
          if (buffer.length() != 0)
          {
              list.add(buffer.toString());
          }
  
          return list.toArray(new String[list.size()]);
      }
docs: Splits a string into a number of tokens. The text is split by '?' and
  '*'. Where multiple '*' occur consecutively they are collapsed into a
  single '*'.
  
  @param text the text to split
  @return the array of tokens, never null