Java切割字符串的踩坑實戰(zhàn)記錄
坑出現(xiàn)的環(huán)境
一般情況下切割字符串會使用split或者StringTokenizer,如下代碼
String s = ",,o,,"; String[] split = s.split(",");
期望得到數(shù)組["","","o","",""],但是實際上會得到["","","o"],后面兩個直接被忽略了,如IDEA運行
StringTokenizer默認情況下
String s = ",,o,,"; StringTokenizer token = new StringTokenizer(s,","); String[] arr = new String[token.countTokens()]; int i = 0; while (token.hasMoreElements()){ arr[i++] = token.nextToken(); }
在IDEA中得到的運行結(jié)果
當StringTokenizer第三個參數(shù)改為true時
StringTokenizer token = new StringTokenizer(s,",",true);
貌似得到了想要的結(jié)果,但是當要切割的字符串改為下面這樣時
String s = ",k,o,,"; StringTokenizer token = new StringTokenizer(s,",",true); String[] arr = new String[token.countTokens()]; int i = 0; while (token.hasMoreElements()){ arr[i++] = token.nextToken(); }
得到的結(jié)果是
數(shù)組的數(shù)量與預期也不符。
實際上java的split內(nèi)部會按照預期的樣子把字符串切割好,但是第二個參數(shù)不傳的情況下默認是0,這就是會導致后面空字符串的值被丟棄
在String的split方法中可以看到
從注釋說明中可以看到,通過改變第二個參數(shù)可以得到預期的結(jié)果
StringTokenizer內(nèi)部也會判斷切割后的值長度是否大于0,大于的情況下才會存儲起來
問題的解決
通過設置split的第二個參數(shù)為-1
String s = ",k,o,,"; String[] split = s.split(",",-1);
補充:java分割字符串常見語法
一.java.lang.String.split()
在java 默認的分隔符是空格("")、制表符(\t)、換行符(\n)、回車符(\r)
示例:
for(String revaal:s.split(" ")){//用空格分隔 System.out.println(count+"ci"+revaal); }
或者
String sourceStr = "1,2,3,4,5"; String[] sourceStrArray = sourceStr.split(","); for (int i = 0; i < sourceStrArray.length; i++) { System.out.println(sourceStrArray[i]); }
如果需要指定分割后的數(shù)量的話,可以在split方法中再傳入指定數(shù)量即可。
String[] sourceStrArray = sourceStr.split(",",4);
split 的實現(xiàn)直接調(diào)用的 matcher 類的 split 的方法。在使用String.split方法分隔字符串時,分隔符如果用到一些特殊字符,可能會得不到我們預期的結(jié)果。在正則表達式中有特殊的含義的字符,我們使用的時候必須進行轉(zhuǎn)義,
1.字符"|","*","+“都得加上轉(zhuǎn)義字符,前面加上”\"。
2.而如果是"",那么就得寫成"\\"。
3.如果一個字符串中有多個分隔符,可以用"|"作為連字符。
二.java.util.StringTokenizer()
StringTokenizer 構(gòu)造方法:
- StringTokenizer(String str) :構(gòu)造一個用來解析 str 的 StringTokenizer 對象。java 默認的分隔符是空格("")、制表符(\t)、換行符(\n)、回車符(\r)。
- StringTokenizer(String str, String delim) :構(gòu)造一個用來解析 str 的 StringTokenizer 對象,并提供一個指定的分隔符。
- StringTokenizer(String str, String delim, boolean returnDelims) :構(gòu)造一個用來解析 str 的 StringTokenizer 對象,并提供一個指定的分隔符,同時,指定是否返回分隔符。
示例:
public static void main(String[] args) { String str = "runoob,google,taobao,facebook,zhihu"; // 以 , 號為分隔符來分隔字符串 StringTokenizer st=new StringTokenizer(str,","); while(st.hasMoreTokens()) { System.out.println(st.nextToken()); } }
StringTokenizer 常用方法:
- int countTokens():返回nextToken方法被調(diào)用的次數(shù)。
- boolean hasMoreTokens():返回是否還有分隔符。
- boolean hasMoreElements():判斷枚舉 (Enumeration) 對象中是否還有數(shù)據(jù)。
- String nextToken():返回從當前位置到下一個分隔符的字符串。
- Object nextElement():返回枚舉 (Enumeration) 對象的下一個元素。
- String nextToken(String delim):與 4 類似,以指定的分隔符返回結(jié)果。
總結(jié)
到此這篇關(guān)于Java切割字符串踩坑的文章就介紹到這了,更多相關(guān)Java切割字符串的坑內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis Mybatis-Plus傳入多個參數(shù)的處理方式
這篇文章主要介紹了Mybatis Mybatis-Plus傳入多個參數(shù)的處理方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05Spring依賴注入Dependency Injection的三種方式
依賴注入(Dependency Injection)和控制反轉(zhuǎn)(Inversion of Control)是同一個概念。具體含義是:當某個角色(可能是一個Java實例,調(diào)用者)需要另一個角色(另一個Java實例,被調(diào)用者)的協(xié)助時,在傳統(tǒng)的程序設計過程中,通常由調(diào)用者來創(chuàng)建被調(diào)用者的實例2023-02-02MybatisPlus,無XML分分鐘實現(xiàn)CRUD操作
這篇文章主要介紹了MybatisPlus,無XML分分鐘實現(xiàn)CRUD操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08Java中數(shù)組和List的互相轉(zhuǎn)換問題小結(jié)
這篇文章主要介紹了Java中數(shù)組和List的互相轉(zhuǎn)換問題小結(jié),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2024-03-03