2015-06-23 59 views
2

我想分割區號和前面的號碼從電話號碼沒有括號,所以我做到了這一點。爲什麼split()產生額外的,設置後限制-1

String pattern = "[\\(?=\\)]"; 
String b = "(079)25894029".trim(); 
String c[] = b.split(pattern,-1); 
for (int a = 0; a < c.length; a++) 
    System.out.println("c[" + a + "]::->" + c[a] + "\nLength::->"+ c[a].length()); 

輸出:

c[0]::-> Length::->0 
c[1]::->079 Length::->3 
c[2]::->25894029 Length::->8 

預期輸出:

c[0]::->079 Length::->3 
c[1]::->25894029 Length::->8 

所以我的問題是,爲什麼split()產生,並在啓動額外的空白,e.g [, 079, 25894029]。這是它的行爲,還是我在這裏做了一些錯誤?

如何獲得預期結果?

+0

這種行爲,如果我沒記錯的話是不是在java8轉載 - 所以它是最有可能的一個漏洞(得到固定的)。 – amit

+0

所以我怎麼能得到我對同樣的問題的預期結果? – Hiru

+0

您可以(1)使用更新後的java8,或(2)如果第一個元素是空字符串,請修剪第一個元素。 (容易做一個單一的條件) – amit

回答

3

首先你在你的角色類裏有不必要的轉義。

String pattern = "[(?=)]"; 

現在,你得到一個空的結果,因爲(是字符串和分裂的第0位在第一個字符會導致確實一個空字符串:作爲你的正則表達式是一樣的。

爲了避免這種結果使用此代碼:

String str = "(079)25894029"; 
toks = (Character.isDigit(str.charAt(0))? str:str.substring(1)).split("[(?=)]"); 
for (String tok: toks) 
    System.out.printf("<<%s>>%n", tok); 

輸出:

<<079>> 
<<25894029>> 
+0

通過應用這種模式我得到這個c [0] :: - >(079所以現在我再次替換「(」與「」所以這是我認爲這是舒適的工作BTW謝謝你回答.. – Hiru

+0

好吧試試我的更新如果(c [0] .equals(「」)){ \t \t \t c [0] = c [0(0).equals(「」)) – anubhava

+1

yes works thank you @anubhava – Hiru

2

Java8 Oracle docs

當存在正寬度匹配在這個字符串的開始 然後一個空的前導子字符串是inc在 結果陣列的開頭。在開始處的零寬度匹配但是從不產生 產生這樣的空領先子字符串。

您可以檢查第一個字符是否爲空字符串,如果是,則修剪該空字符串字符。

+0

] .trim(); \t \t}「 – Hiru

1

你的正則表達式有問題,你的方法也是如此 - 你不能用任何正則表達式的方法來解決它。您尋求的魔術單線是:

String[] c = b.replaceAll("^\\D+|\\D+$", "").split("\\D+"); 

這將刪除所有前導/後續非數字,然後拆分爲非數字。這將處理許多不同的格式和分隔符(自己嘗試一些)。

參見本live demo

String b = "(079)25894029".trim(); 
String[] c = b.replaceAll("^\\D+|\\D+$", "").split("\\D+"); 
System.out.println(Arrays.toString(c)); 

生產這樣的:

[079, 25894029] 
+0

是的,它幾乎可以工作+1 !!但是你能解釋什麼是你的模式中的\\ D? – Hiru

+1

@hiru它超過*幾乎*工作;它確實按照你的問題的要求 - 見答案中的鏈接正則表達式\ D表示「非數字字符」,與\ d相反,意思是「一個數字字符」。 – Bohemian

+0

確實很感謝這個謝謝.. – Hiru

相關問題