我嘗試String.split(regexp)
方法來解析字符串"[01.02.2016][0][]"
到"01.02.2016"
和"0"
,使用正則表達式旁邊:"[\\[(*?)\\]]"
或"\\[|\\]"
或"[\\[+\\]]"
。String.split()的副作用,或正則表達式錯誤?
但方法總是返回數組["", "01.02.2016","","0"]
。 String.split(regexp)
是正常結果,還是我在正則表達式中的錯誤?
我嘗試String.split(regexp)
方法來解析字符串"[01.02.2016][0][]"
到"01.02.2016"
和"0"
,使用正則表達式旁邊:"[\\[(*?)\\]]"
或"\\[|\\]"
或"[\\[+\\]]"
。String.split()的副作用,或正則表達式錯誤?
但方法總是返回數組["", "01.02.2016","","0"]
。 String.split(regexp)
是正常結果,還是我在正則表達式中的錯誤?
正如TheLostMind所示。使用Pattern和Matcher一個可能的解決方案可能是:
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)
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
如果你不能幫助,投入者不會花費不必要的東西 –
你的解決方案目前還不是最優的。首先,用一個空格替換與「數字」或句號不匹配的所有內容。基本上,你用空格替換']'和'[''字符。然後修剪它,從字符串的開頭和結尾刪除空格。 然後,您再進行一次正則表達式傳遞,將字符串拆分爲與「數字」或句點不匹配的任何內容。本質上,你在空間字符分裂,因此爲什麼x1 [1]是一個空字符串。 看看上面的解決方案,這些解決方案可以更好地理解正則表達式。 – Buurman
的String.split
試圖據此找到你的模式和分裂的比賽。 一個使用的例子是你想要根據逗號和分號分割一個字符串。 在這種情況下,您將使用「regexp」,|;
。
在你的情況下,如果你使用,例如"\\[|\\]"
這意味着當它找到一個開放的括號或封閉的一個分裂。 因此,您在第一個開放式括號之前有空,在相同之前和關閉之前的日期,在關閉和打開之間爲空,依此類推。
正如@TheLostMind所示,您希望使用Pattern
和Matcher
和組代替。
'String.split(正則表達式)'*分裂*根據* *分隔字符串,它不*解析一看*字符串。使用「模式」和「匹配器」匹配字符串 – TheLostMind
並得到匹配的組,並且是的,這確實是預期的行爲 – TheLostMind