JAva文字列splitには穴がたくさんあるので、気をつけて使ってください!!


System.out.println(":ab:cd:ef::".split(":").length);//          
System.out.println(":ab:cd:ef::".split(":",-1).length);//          
System.out.println(StringUtils.split(":ab:cd:ef::",":").length);//                 
System.out.println(StringUtils.splitPreserveAllTokens(":ab:cd:ef::",":").length);//           apache commons   : 4 6 3 6 

 
StringUtils.split(「:ab:cd:ef:」、「:」)の先頭と末尾の区切り文字はすべて無視されているというコメントを見ました  正しいかどうか分からないので、ソースコードを直接見に行きました.
マイjarパッケージ  commons-lang-2.5.jarパッケージで関連操作のソースコードを表示

	private static String[] splitWorker(String str, String separatorChars, int max, boolean preserveAllTokens)
	{
	  if (str == null) {
	    return null;
	  }
	  int len = str.length();
	  if (len == 0) {
	    return ArrayUtils.EMPTY_STRING_ARRAY;
	  }
	  List list = new ArrayList();
	  int sizePlus1 = 1;
	  int i = 0;int start = 0;
	  boolean match = false;
	  boolean lastMatch = false;
	  if (separatorChars == null)
	  {
	    while (i < len)
	      if (Character.isWhitespace(str.charAt(i))) {
	        if ((match) || (preserveAllTokens)) {
	          lastMatch = true;
	          if (sizePlus1++ == max) {
	            i = len;
	            lastMatch = false;
	          }
	          list.add(str.substring(start, i));
	          match = false;
	        }
	        i++;start = i;
	      }
	      else {
	        lastMatch = false;
	        match = true;
	        i++;
	      } }
	  if (separatorChars.length() == 1)  //        1  。
	  {
	    char sep = separatorChars.charAt(0);  //        
	    while (i < len) {                        //          
    	/**
    	 *                           ,            ,            。
    	 *                       ,      ,match   false,      true,      。
    	 * 
    	 *               
    	 * match        
    	 * =========false
    	 * =========false
    	 * =========true   
    	 * =========true
    	 * =========false
    	 * =========true
    	 * =========true
    	 * =========false
    	 * =========true
    	 * =========true
    	 * =========false
    	 */
	   System.out.println("========="+match);
	      if (str.charAt(i) == sep) {           
	        if ((match) || (preserveAllTokens)) {   //          
	          lastMatch = true;
	          if (sizePlus1++ == max) {
	            i = len;
	            lastMatch = false;
	          }
	          list.add(str.substring(start, i));
	          match = false;
	        }
	        i++;start = i;
	      }
	      else {
	        lastMatch = false;
	        match = true;
	        i++;
	      }
	    }
	  } else {
	    while (i < len)
	      if (separatorChars.indexOf(str.charAt(i)) >= 0) {
	    	 
	        if ((match) || (preserveAllTokens)) {
	          lastMatch = true;
	          if (sizePlus1++ == max) {
	            i = len;
	            lastMatch = false;
	          }
	          list.add(str.substring(start, i));
	          match = false;
	        }
	        i++;start = i;
	      }
	      else {
	        lastMatch = false;
	        match = true;
	        i++;
	      }
	  }
	  if ((match) || ((preserveAllTokens) && (lastMatch))) {
	    list.add(str.substring(start, i));
	  }
	  return (String[])list.toArray(new String[list.size()]);
	}