關於字符串split一些用法
阿新 • • 發佈:2019-01-30
cati lai 利用 調用 ces images aci regex net
?
split方法在大數據開發中的多用於日誌解析及字段key值分割,最近需求中碰到一個問題在
無論怎麽分割都會出現數組下標越界問題,
由於前臺在sdk中多加了幾個字段(測試數據很少,大多為空) ,需要我們進行字段補全插入到mysql中,但項目過於老,2016年項目使用的是spark1.5.2不說,使用java寫的
業務很簡單就是進行字段拼接為key進行pv uv IP求和 ,但在添加key時,代碼報錯了 在苦苦找到spark on yarn的日誌後,
使用 yarn logs -appicationId jobid號 查看(ui的日誌根本沒配合適無法打開),頻頻報出數組下標越界問題
原因就在split第二參數被我忽略了,傳一個分隔符,後面為空的不會進行截取,長度也就是實際有值的那幾個字段,我是真的菜
那麽後邊的這個int類型的參數是幹麽用的?很簡單,設定利用split函數截取字符串,截取的結果的閥值。-1表示無限制,雖然直接用只有一個參數的split函數也是無限制,但是那樣的話,後面如果分隔符之間為空的話,就不會截取。
public static void main(String[] args) { // TODO Auto-generated method stub String str1 = "a,b,c,,,a"; String str2 = "a,b,c,,,"; String str3 = "a,b,c, , ,"; String[] s1= str1.split(","); String[] s2 = str2.split(","); String[] s3 = str3.split(","); System.out.println("str1長度:"+s1.length); System.out.println("str2長度:"+s2.length); System.out.println("str3長度:"+s3.length); }
解決方法:
通過查看API我們發現我們常用的split方法默認傳遞的是0,現在解決str2輸出空的解決方法是傳遞的第二個參數為負數,即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public static void main(String[] args) {
// TODO Auto-generated method stub
String str1 = "a,b,c,,,a" ;
String str2 = "a,b,c,,," ;
String str3 = "a,b,c, , ," ;
String[] s1 = str1.split( "," );
String[] s2 = str2.split( "," ,- 1 );
String[] s3 = str3.split( "," ,- 1 );
System.out.println( "str1長度:" +s1.length);
System.out.println( "str2長度:" +s2.length);
System.out.println( "str3長度:" +s3.length);
}
|
經查找API發現在String類中,存在兩個split重載方法
1.public String[] split(String regex)
根據給定正則表達式的匹配拆分此字符串。
該方法的作用就像是使用給定的表達式和限制參數 0 來調用兩參數 split 方法。因此,所得數組中不包括結尾空字符串。
例如,字符串 "boo:and:foo" 使用這些表達式可生成以下結果:
Regex 結果
?1 2 |
: { "boo" , "and" , "foo" }
o { "b" , "" , ":and:f" }
|
參數:
regex - 定界正則表達式
返回:
字符串數組,它是根據給定正則表達式的匹配拆分此字符串確定的
拋出:
PatternSyntaxException - 如果正則表達式的語法無效
關於字符串split一些用法