簡體   English   中英

字符串類拆分功能正在返回惡劣的結果

[英]String class split funtion is returning abigious results

以下是2個代碼

System.out.println(",,,,,".split(",").length);

System.out.println(",,,,, ".split(",").length);

對於第一個代碼,它打印的結果是0,而對於第二個代碼結果,它打印的是6。

我的問題是為什么分裂無法識別“,”當我沒有在末尾添加額外空間但是當我在末尾添加額外空間時能夠識別它。

請注意我已經嘗試使用正則表達式“\\\\ s *,\\\\ s”,但結果是一樣的。

我沒有這方面的文檔參考,但根據經驗,我在測試String#split看到的是,如果沒有實際的文本匹配,那么數組中也不會返回零寬度匹配。 所以以下返回一個空數組:

",,,,,".split(",")

但是,如果在逗號系列的末尾添加空格然后執行相同的拆分,則會有一個匹配空間。 因此,數組返回所有匹配項,包括零寬度匹配:

",,,,, ".split(",")

但是,因為逗號之間沒有內容,我會將您的實際要求解釋為希望將每個逗號分成單獨的結果。 如果是這樣,那么你可以使用lookarounds進行拆分,如下所示:

String input = ",,,,,";
String[] parts = input.split("(?<=,)(?=,)");
for (String part : parts) {
    System.out.println(part);
}

這輸出:

,
,
,
,
,

演示

java中的split()默認情況下從結果數組中刪除尾隨的空字符串。 要保持為空,可以使用split(delimiter, limit)並將limit設置為負值,如下所示

System.out.println(",,,,," .split(",", -1).length);

讓我們更多地了解下面拆分的有趣結果:

System.out.println(",,,,,,".split(",").length); // 0
System.out.println(",,,,,, ".split(",").length); // 7
System.out.println(",,, ,,,".split(",").length); // 4
System.out.println(" ,,,,,,".split(",").length); // 1

想知道為什么會發生這種情況是因為下面的語句中的分割方法聲明如下:

因此,結尾的空字符串不包含在結果數組中。

文檔: https//docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String)

如果您不希望split方法刪除該空格,那么您應該使用另一個具有limit的拆分:

public String[] split(String regex,int limit)

文檔: https//docs.oracle.com/javase/7/docs/api/java/lang/String.html#split( java.lang.String,% 20int)

例:

System.out.println(",,,,,,".split(",",-1).length); // 7
System.out.println(",,,,,, ".split(",",-1).length); // 7
System.out.println(",,, ,,,".split(",",-1).length); // 7
System.out.println(" ,,,,,,".split(",",-1).length); // 7

忘記文檔,我直接查看代碼並在java.lang.String#split(java.lang.String, int)找到以下代碼java.lang.String#split(java.lang.String, int) : -

while (resultSize > 0 && list.get(resultSize - 1).length() == 0) {
    resultSize--;
}

這證明它被設計為在最后一個元素為空時刪除它 並繼續這樣做,直到最后一個元素不是零長度。

此功能很有用,例如,如果你有一個字符串a,b,它應該在結果數組中返回ab ,而不是在最后一個逗號后面的最后一個空白字符''

如果你做System.out.println(", ,,,".split(",").length); 它將返回2因為上面的while循環將繼續減少右側的結果,直到找到長度非零的東西。

上面的while循環包含在if (limit == 0) 因此,如果您想要全部計算,請使用非零限制。 如果您不想要任何限制,請使用負數,如-1。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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