可以使用环视来完成:
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