我正在创建一个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 2”,然后他继续“H 2 O_2”,立即成为“H 2 O 2”
答案 0 :(得分:1)
您不能仅使用.replaceAll()
执行此操作。您需要Pattern
和Matcher
,如下所示:
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);
}