簡體   English   中英

分割字符串顯示更多字符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM