У вас проблемы с вашим мышлением.
Вы просите: Если ввод недействителен, удалите его.
Это проблематично; невозможно, за исключением вставки, когда-либо получить действительный ввод без «прохождения» недопустимого ввода.
Допустим, я хочу ввести AA00, который действителен.
Я нажимаю в вашем текстовое поле, введите «A», и мой A немедленно стирается. В конце концов, 'A' недействителен.
Даже если вы попытаетесь учесть это, разрешив использование одного символа или изменив правило «что действительно» с помощью: «Одна буква или di git тоже действительно ", то, что вы создали сейчас, невероятно раздражает. Если я вставляю идентификатор из другого места, и мой идентификатор начинается с пробела, тогда я думаю, что мой компьютер сломан: я вставляю «AA00», и мой текст просто исчезает на мне.
* 1012 пользовательский интерфейс.
Вот альтернативный, столь же простой подход:
Вы добавляете измененный слушатель. Вы проверяете ввод. Если ввод действителен, раскрасьте фон элемента ввода светло-зеленым оттенком. Если поле ввода пусто, раскрасьте его в цвет фона по умолчанию. В противном случае придайте ему красный оттенок.
Теперь я получаю визуальную обратную связь, когда набираю идентификаторы.
Практическое правило довольно простое: Не связывайтесь с вводом пользователя, если вы не действительно, ДЕЙСТВИТЕЛЬНО знаю, что вы делаете .
Вы создали действительно сложное регулярное выражение. Этот тривиальный ответ будет соответствовать именно тому, что вы просили: 2 символа, которые могут быть буквами или цифрами, за которыми следует любое количество цифр:
Pattern.compile("^[a-zA-Z0-9]{2}[0-9]*$")
- это все, что вам нужно. Он даже читается так, как вы спросили: «2 буквы / цифры», затем «любое количество цифр».