[英]Java Split not working as expected
我試圖使用一個簡單的拆分來分解以下字符串:00-00000
我的表達式是: ^([0-9][0-9])(-)([0-9])([0-9])([0-9])([0-9])([0-9])
我的用法是:
String s = "00-00000";
String pattern = "^([0-9][0-9])(-)([0-9])([0-9])([0-9])([0-9])([0-9])";
String[] parts = s.split(pattern);
如果我使用Pattern和Matcher類,我可以看到我的模式匹配,匹配器告訴我我的groupCount是7這是正確的。 但是,當我嘗試分裂他們時,我沒有運氣。
String.split不使用捕獲組作為結果。 它找到任何匹配並將其用作分隔符。 因此,結果String []是正則表達式匹配之間的子串。 因為正則表達式匹配整個字符串,並且整個字符串作為分隔符,所以沒有其他任何東西留下,所以它返回一個空數組。
如果你想使用正則表達式捕獲組,你將不得不使用Matcher.group() ,String.split()將不會。
舉個例子,你可以這樣做:
String s = "00-00000";
String pattern = "-";
String[] parts = s.split(pattern);
我不能確定,但我認為你要做的是將每個匹配的組放入一個數組中。
Matcher matcher = Pattern.compile(pattern).matcher();
if (matcher.matches()) {
String s[] = new String[matcher.groupCount()) {
for (int i=0;i<matches.groupCount();i++) {
s[i] = matcher.group(i);
}
}
}
從文檔:
String[] split(String regex)
- 返回:通過圍繞給定正則表達式的匹配拆分此字符串計算的字符串數組
本質上,正則表達式用於定義輸入字符串中的分隔符。 您可以在模式中使用捕獲組和反向引用(例如,用於外觀),但最重要的是模式匹配的內容和位置,因為它定義了返回數組的內容。
如果要使用正則表達式將原始字符串拆分為7個部分,則可以執行以下操作:
String s = "12-3456";
String[] parts = s.split("(?!^)");
System.out.println(parts.length); // prints "7"
for (String part : parts) {
System.out.println("Part [" + part + "]");
} // prints "[1] [2] [-] [3] [4] [5] [6] "
這會分為零長度匹配斷言(?!^)
,除了字符串中的第一個字符之外的任何地方。 這可以防止空字符串成為數組中的第一個元素,並且尾隨空字符串已被丟棄,因為我們使用默認limit
參數進行split
。
但是,使用正則表達式來獲取像這樣的字符串的單個字符是一種過度殺傷力。 如果你只有幾個字符,那么最簡潔的選擇是在toCharArray()
上使用foreach
:
for (char ch : "12-3456".toCharArray()) {
System.out.print("[" + ch + "] ");
}
如果您有一個更長的字符串,這不是最有效的選項。
-
這也可能是您正在尋找的:
String s = "12-3456";
String[] parts = s.split("-");
System.out.println(parts.length); // prints "2"
for (String part : parts) {
System.out.print("[" + part + "] ");
} // prints "[12] [3456] "
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.