Регулярные выражения. Ввод только цифр 0-20 в EditText

В EditText необходимо вводить только цифры от 0-20. Приведенный код не пропускает ни одной цифры. Но исправно работает на выражениях вроде [1-3].

private static final String PATTERN ="^([1-9]|1[1-9]|20)\\d{1,2}$";
eT2.setFilters(new InputFilter[] {
    new InputFilter() {
       public CharSequence filter(CharSequence src, int start,int end, Spanned dst, int dstart, int dend) {
                Matcher matcher=Pattern.compile(PATTERN).matcher(src);
                if(!matcher.matches()) return "";  
                return src;
       }
    }
});

Ответы (2 шт):

Автор решения: tym32167

Как пример

bool IsNumberAndFromZeroToTwenty(string input)
{
    if (input.Length == 1) return char.IsDigit(input[0]);
    if (input.Length == 2)
        return ((input[0] == '0' || input[0] == '1') && char.IsDigit(input[1]))
                || (string.Compare(input, "20") == 0);
    return false;
}

Проверка

var tests = new[] {"abc", "a20", "-20", "21", "4", "0", "20", "-0"};
foreach (var test in tests)
    Console.WriteLine($"{test} is {IsNumberAndFromZeroToTwenty(test)}");

Результат

abc is False
a20 is False
-20 is False
21 is False
4 is True
0 is True
20 is True
-0 is False
→ Ссылка
Автор решения: 1111 2222

Реализовал через TextWatcher и метод onTextChange. В реализации через InputFilter не работает.

private static final String PATTERN ="^([0-9]|1[0-9]|2[0])$";
eT2.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) {
            Matcher matcher = Pattern.compile(PATTERN).matcher(s);
            if (matcher.matches()) {
                // do something
            }
            else {
                eT2.getText().clear();
            }
        }
        @Override
        public void afterTextChanged(Editable s) {

        }
    });
→ Ссылка