2016-03-23 49 views
2

我嘗試String.split(regexp)方法來解析字符串"[01.02.2016][0][]""01.02.2016""0",使用正則表達式旁邊:"[\\[(*?)\\]]""\\[|\\]""[\\[+\\]]"String.split()的副作用,或正則表達式錯誤?

但方法總是返回數組["", "01.02.2016","","0"]String.split(regexp)是正常結果,還是我在正則表達式中的錯誤?

+8

'String.split(正則表達式)'*分裂*根據* *分隔字符串,它不*解析一看*字符串。使用「模式」和「匹配器」匹配字符串 – TheLostMind

+1

並得到匹配的組,並且是的,這確實是預期的行爲 – TheLostMind

回答

1

正如TheLostMind所示。使用PatternMatcher一個可能的解決方案可能是:

String s = "[01.02.2016][0][]"; 
Pattern p = Pattern.compile("(\\[[^\\]]*\\])"); 
Matcher m = p.matcher(s); 
while (m.find()) { 
    System.out.println("part = " + m.group()); 
} 

輸出

part = [01.02.2016] 
part = [0] 
part = [] 

編輯正如Kuzeko指出。如果你想獲得零件沒有周圍括號[]修改代碼如下。

String s = "[01.02.2016][0][]"; 
Pattern p = Pattern.compile("\\[([^\\]]*)\\]"); // pattern changed 
Matcher m = p.matcher(s); 
while (m.find()) { 
    System.out.println("part = " + m.group(1)); // accessed group changed 
} 

輸出

part = 01.02.2016 
part = 0 
part = 

編輯你的問題的第二部分。 String.split按照您的要求工作。見下文

[\\[(*?)\\]]實施例 - 作爲delimitter的[(*?]任何字符使用(因爲它們內[...]

String s = "1[2(3*4?5)6]7"; 
System.out.println(Arrays.toString(s.split("[\\[(*?)\\]]"))); 
// output 
[1, 2, 3, 4, 5, 6, 7] 

\\[|\\]分組 - 使用作爲delimitter []

String s = "1[2]3"; 
System.out.println(Arrays.toString(s.split("\\[|\\]"))); 
// output 
[1, 2, 3] 

[\\[+\\]] - 使用作爲限制[+]的任何字符(因爲它們被分組在[...]

String s = "1[2[3+4]5"; 
System.out.println(Arrays.toString(s.split("[\\[+\\]]"))); 
// output 
[1, 2, 3, 4, 5] 

當您未指定結果閾值時,省略了空白字段。

String s = ",1,2,,,"; 
System.out.println(Arrays.toString(s.split(","))); 
// output 
[, 1, 2] 
System.out.println(Arrays.toString(s.split(",", 5))); 
// output 
[, 1, 2, , ,] 

有關說明是如何工作的細節有API String.split(s,int)

+0

或者如果你不想找到空的括號對,你可以用'+'替換'*'。 – biziclop

+0

你應該使用'()'來分組和僅返回括號內的文本作爲OP需要 – Kuzeko

+0

Thnks,我使用模式和匹配器,但也想知道是String.split()的預期結果。 –

-3

試試這個[問題已解決]

String name ="[01.02.2016][0][]"; 
     name=name.replaceAll("[^\\d.]", " ").trim(); 
     String[] x1=name.split("[^\\d.]"); 
     System.out.println("name = "+x1[0]); 
     System.out.println("name = "+x1[2]); 

輸出

name = 01.02.2016 
name = 0 
+2

如果你不能幫助,投入者不會花費不必要的東西 –

+2

你的解決方案目前還不是最優的。首先,用一個空格替換與「數字」或句號不匹配的所有內容。基本上,你用空格替換']'和'[''字符。然後修剪它,從字符串的開頭和結尾刪除空格。 然後,您再進行一次正則表達式傳遞,將字符串拆分爲與「數字」或句點不匹配的任何內容。本質上,你在空間字符分裂,因此爲什麼x1 [1]是一個空字符串。 看看上面的解決方案,這些解決方案可以更好地理解正則表達式。 – Buurman

0

String.split試圖據此找到你的模式和分裂的比賽。 一個使用的例子是你想要根據逗號和分號分割一個字符串。 在這種情況下,您將使用「regexp」,|;

在你的情況下,如果你使用,例如"\\[|\\]"這意味着當它找到一個開放的括號或封閉的一個分裂。 因此,您在第一個開放式括號之前有空,在相同之前和關閉之前的日期,在關閉和打開之間爲空,依此類推。

正如@TheLostMind所示,您希望使用PatternMatcher和組代替。