JAva文字列splitには穴がたくさんあるので、気をつけて使ってください!!
3325 ワード
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()]);
}