2012-05-07 2 views
1

Я создаю 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")))); 
    } 

Это генерирует исключение NullPointer в методе run().

Edit:

Вот пример вывода:

Типы пользователей "H_2" и это сразу становится "H₂", то он по-прежнему "H₂O_2", который сразу становится "перекиси водорода"

+0

Я думаю, что подчеркивание символ должен быть экранирован в регулярном выражении: '\\ _' (только в 'replaceAll()', но не в 'содержит()') – Stephan

ответ

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); 

} 
+0

getInterger() все еще бросает исключение NullPointerException. Правильно ли используется код регулярного выражения для группы 1? – Derek

+1

Используйте '.valueOf()' вместо '.getInteger()'. Я никогда не использовал этот метод, и в отношении javadoc он * определяет целочисленное значение системного свойства с указанным именем *, которое не то, что вы ищете, я думаю :) – sp00m

+0

Фактически, я просто понял что вам нужно. Мой ответ не поможет. Я ищу что-то еще. – sp00m

Смежные вопросы