2

ユーザーが C9H11N02 などの化学物質を入力できるようにするプログラムを作成しています。彼らがそれに入ると、私はそれをバラバラにして、C9、H11、N、02のようにできるようにしたい.一緒。これは私がこれまで行ってきたことです。使用した正規表現を使用して整数値を抽出できますが、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])");

ルックアラウンドは、ゼロ幅の消費しないアサーションです。

この正規表現は、2 つのルック アラウンドが一致する場所で入力を分割します。

  • (?<=.)「前の文字がある」ことを意味します(つまり、入力の開始時ではありませ
  • (?=[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 に答える