1

アンダースコアの直後に数字が続くJTextFieldを、下付き文字に即座に変更するJTextFieldを作成しています。replaceAllに関連する正規表現コードについてサポートが必要です。正規表現グループについて少し読んだことがありますが、この場合、アンダースコアの後の番号を取得する方法を完全には理解していません。

添え字コード:

// Only 0 - 9 for now...
private String getSubscript(int number)
    {
        String[] sub = {"\u2080", "\u2081","\u2082","\u2083","\u2084","\u2085","\u2086","\u2087","\u2088","\u2089" };
        return sub[number];
    }

更新コードを挿入:

public void insertUpdate(DocumentEvent e) {
        if (textField.getText().contains("_"))
        {
            SwingUtilities.invokeLater(this);
        }
    }

実際の置換が行われる場所(DocumentListenerメソッドでテキストフィールドを直接編集できないため:

public void run()
    {
        textField.setText(textField.getText().replaceAll("_([0-9])+", getSubscript(Integer.getInteger("$1"))));
    }

これにより、run()メソッドでNullPointer例外がスローされます。

編集:

出力例を次に示します。

ユーザーが「H_2」と入力すると、すぐに「H₂」になり、「H₂O_2」を続けてすぐに「H₂O₂」になります。

4

1 に答える 1

1

を使用してこれを行うことはできません.replaceAll()。あなたが必要PatternMatcherし、次のように:

public void run() {

    String text = textField.getText();
    Pattern pattern = Pattern.compile("_[0-9]+");
    Matcher matcher = pattern.matcher(text);

    while (matcher.find()) {
        // get the init string (e.g. "_42")
        String group = matcher.group();
        // parse it as an int (i.e. 42)
        int number = Integer.valueOf(group.substring(1));
        // replace all "_42" with the result of getSubscript(42)
        text = text.replaceAll(group, getSubscript(number));
        // recompile the matcher (less iterations within this while)
        matcher = pattern.matcher(text);
    }

    textField.setText(text);

}
于 2012-05-07T07:52:39.520 に答える