Различное поведение регулярных выражений на разных устройствах

У меня странная ошибка, когда я пытаюсь проверить EditText (Я хочу, чтобы текст был IBAN, как FR76 2894 2894 2894 289), поэтому я делаю это (переопределяя мой текст редактирования onTextChanged):

// format with IBAN regex
@Override
protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
    editText.setText(editText.getText().toString().replaceAll(" ", "")
            .toUpperCase().replaceAll("[a-zA-Z]{2}[0-9]{2}[a-zA-Z0-9]{4}[0-9]{7}([a-zA-Z0-9]?){0,16}", "$0 ")); 
}

Я делаю сравнение с двумя разными телефонами Android: Asus Zenfone и Honor 5C.

Оба устройства имеют одинаковый bevahiour на первом набранном символе (действует, только если это буква). Но тогда, когда я набираю вторую букву (текст должен быть FR после этого):

Honor 5C: (ожидаемое поведение)

Asus Zenfone: (неправильное поведение)

Любая идея? Спасибо за вашу помощь.

1 ответ

Как видно из документации, звонить по телефону - плохая идея. setText от onTextChanged:

Этот метод вызывается при изменении текста, если какие-либо подклассы хотели бы знать. Внутри текста символы lengthAfter, начинающиеся с начала, только что заменили старый текст длиной lengthBefore.

Ошибка при попытке внести изменения в текст из этого обратного вызова.

Вы пробовали использовать TextWatcher на вашем EditText? Например:

editText.addTextChangedListener(new TextWatcher() {
      @Override
      public void beforeTextChanged(CharSequence s, int start, int count, int after) {

      }

      @Override
      public void onTextChanged(CharSequence s, int start, int before, int count) {

      }

      @Override
      public void afterTextChanged(Editable s) {
        // This is only a sample code trying to reproduce your current behavior. 
        // I did not test it.
        String iban = s.toString().toUpperCase().replaceAll(" ", "");
        String compactIban = iban.replaceAll("[a-zA-Z]{2}[0-9]{2}[a-zA-Z0-9]{4}[0-9]{7}([a-zA-Z0-9]?){0,16}", "$0 ");
        s.replace(0, s.length(), compactIban);
      }
    });
Другие вопросы по тегам