它可以使用look arounds來完成:
String[] parts = input.split("(?<=.)(?=[A-Z])");
查找變通是零寬度,非消耗的斷言。
此正則表達式將輸入其中兩個外表變通匹配:
(?<=.)
意味着「有是之前的字符」(即未在輸入的開始)
(?=[A-Z])
的意思是「下一個字符是一個大寫字母」(所有的元素與A-Z
開始)
這是一個測試,包括對一些邊緣情況下,雙字符符號:
public static void main(String[] args) {
String input = "C9KrBr2H11NO2";
String[] parts = input.split("(?<=.)(?=[A-Z])");
System.out.println(Arrays.toString(parts));
}
輸出:
[C9, Kr, Br2, H11, N, O2]
然後,如果您想分裂的各個組件,使用split()
嵌套調用:
public static void main(String[] args) {
String input = "C9KrBr2H11NO2";
for (String component : input.split("(?<=.)(?=[A-Z])")) {
// split on non-digit/digit boundary
String[] symbolAndNumber = component.split("(?<!\\d)(?=\\d)");
String element = symbolAndNumber[0];
// elements without numbers won't be split
String count = symbolAndNumber.length == 1 ? "1" : symbolAndNumber[1];
System.out.println(element + " x " + count);
}
}
輸出:
C x 9
Kr x 1
Br x 2
H x 11
N x 1
O x 2
@BheshGurung不太確定... – Bohemian
我不明白,你想用什麼字符串溢出空格作爲分隔符? – PermGenError
你可以通過從正則表達式調用函數來實現這一點 - 請參閱http://stackoverflow.com/questions/1742798/increment-a-number-in-a-string-in-with-regex - 但這是Java ... – DNA