使用Java中的正则表达式拆分输入

时间:2012-11-11 22:39:42

标签: java

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

3 个答案:

答案 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
}