我正在制作一个让用户输入化学物质的程序,例如C9H11N02。当他们进入时,我想将它分成几块,所以我可以像C9,H11,N,02那样。当我这样做时,我想对它进行更改,这样我就可以把它变成C10H12N203,然后把它放回去一起。这就是我到目前为止所做的。使用我用过的正则表达式我可以提取整数值,但是我怎样才能得到C10,H11等...?
System.out.println("Enter Data");
Scanner k = new Scanner( System.in );
String input = k.nextLine();
String reg = "\\s\\s\\s";
String [] data;
data = input.split( reg );
int m = Integer.parseInt( data[0] );
int n = Integer.parseInt( data[1] );
答案 0 :(得分:3)
可以使用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
答案 1 :(得分:2)
你是不是意外地把零写入那些字母“O”(氧气)应该是的公式?如果是这样的话:
"C10H12N2O3".split("(?<=[0-9A-Za-z])(?=[A-Z])");
[C10, H12, N2, O3]
"CH2BrCl".split("(?<=[0-9A-Za-z])(?=[A-Z])");
[C, H2, Br, Cl]
答案 2 :(得分:1)
我相信以下代码应该允许您提取各种元素及其相关计数。当然,括号会使事情变得更复杂,但你没有问过它们!
Pattern pattern = Pattern.compile("([A-Z][a-z]*)([0-9]*)");
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
String element = matcher.group(1);
int count = 1;
if (matcher.groupCount > 1) {
try {
count = Integer.parseInt(matcher.group(2));
} catch (NumberFormatException e) {
// Regex means we should never get here!
}
}
// Do stuff with this component
}