2

我正在制作一个程序,让用户输入化学物质,例如 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] );
4

3 回答 3

4

可以使用环视来完成:

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
于 2012-11-12T01:25:15.773 回答
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]
于 2012-11-11T22:57:31.717 回答
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
}
于 2012-11-11T23:02:07.647 回答