[英]Split string displays more character
我正在嘗試分割一個17字節的字符串,但是當我顯示長度時它顯示18。
String s1 = "{{ (( 4 + 5 )) }}";
String[] s2 = s1.split("");
System.out.println("length = " + s2.length);
它在Java 7中顯示的長度為18
,因為用空字符串分割會在每個字符前后找到一個定界符。
{ { ( (...
^ ^ ^ ^ ^
在Java 7中, 尾隨的空字符串被丟棄 。
如果n為零,則該模式將被盡可能多地應用,該數組可以具有任何長度,並且尾隨的空字符串將被丟棄。
因此,在Java 7中,長度為18
,因為尾隨的空字符串被丟棄,而前導的空字符串未被丟棄。
包括這條線
System.out.println(Arrays.toString(s2));
產生此輸出
[, {, {, , (, (, , 4, , +, , 5, , ), ), , }, }]
與前導空字符串。
但是,在Java 8中, 該語句現在包含在Javadocs中 。
如果此字符串的開頭存在正寬匹配,則在結果數組的開頭將包含一個空的前導子字符串。 開頭的零寬度匹配永遠不會產生這樣的空前導子字符串。
它在Java 7 javadocs中不存在。
看起來行為已更改為消除零寬度匹配的前導字符串,此問題就是這種情況。
Java 8輸出:
[{, {, , (, (, , 4, , +, , 5, , ), ), , }, }]
開始,
后的陣列打印[
現在消失了,而現在的長度為17
。
看來您正在使用Java 7。
在Java 8 "foo".split("")
之前,在每個空字符串上進行拆分,但是由於在每個字符之前和之后都存在空字符串,因此我們在此位置有效地進行了拆分(用|
標記) |f|o|o|
它在第一個數組上生成["", "f","o","o",""]
。
現在,由於split
也刪除了空的尾隨字符串"foo".split("")
因此將返回此數組["", "f","o","o"]
,並且您看到它在開始時有一個空字符串。
您可以通過拆分不在字符串開頭的位置來解決此問題。 您可以使用split("(?<!^)")
使用正則表達式與負向后看(?<!...)
它使用字符串的開始與代表^
。
String[] s2 = s1.split("(?<!^)"); //for "foo" this split returns ["f","o","o"]
其他人無法重現您的問題,因為此行為在Java 8中已更改: 為什么在Java 8中split有時會在結果數組的開頭刪除空字符串?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.