2015-05-14 2 views
0

Я пытаюсь создать регулярное выражение, которое найдет только что-то подобное: 1; 12; 12,4; 12,45; 12,4; 12.45 (цифры могут быть разными).Десятичные числа Android TextWatcher

Это мое регулярное выражение регулярных выражений:??? ^[0-9] [0-9] [.] [0-9] [0-9] $, , но она проходит, например, , но я не хочу этого.

Я хочу создать EditText с TextWatcher, который будет фильтровать текст по регулярному выражению.

Мой код:

TextWatcher DiscountTextWatcher = new TextWatcher() 
{ 
    private final Pattern sPattern = Pattern.compile("^[0-9]?[0-9]?[,.]?[0-9]?[0-9]?$"); 

     private CharSequence mText = ""; 

     private boolean isValid(CharSequence s) { 
      return sPattern.matcher(s).matches(); 
     } 

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

     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
             int after){ 
      mText = isValid(s) ? s : mText; 
     } 

     @Override 
     public void afterTextChanged(Editable s) 
     { 
      if (!isValid(s) || s.length() > 4) 
      { 
       addDocumentDiscountValue.removeTextChangedListener(this); 
       addDocumentDiscountValue.setText(mText); 
       addDocumentDiscountValue.setSelection(mText.length()); 
       addDocumentDiscountValue.addTextChangedListener(this); 
      } 
     } 
    }; 

EDIT:

Теперь у меня лучше регулярное выражение (спасибо @ nu11p01n73R), но она по-прежнему не работает. I не может написать двоеточие после двух чисел, не знаю почему. Это странно, но три номера подряд работает ...

ответ

2

Проблема с регулярным выражением

Ошибкой вы сделали это вы сделали каждый класс символов по желанию.

Так движок регулярных выражений будет пытаться обмануть, устраняя те классы, которые не должны соответствовать

То есть, когда вы даете на вход

1234 

движок регулярных выражений будет безопасно игнорировать характер clas [,.], чтобы он соответствовал вводу, потому что вы дали им как необязательный.

How ^[0-9]?[0-9]?[,.]?[0-9]?[0-9]?$ матчи 1234

1234 
| 
[0-9]? #first optional 

1234 
| 
[0-9]? #second optional 

1234 
    | 
    Here the next patern is [,.]. The regex engine cannot match this pattern to input. Since it is optional, it just forgets for the moment that such a pettern was there ;) 

1234 
    | 
[0-9]? # Third optional 

1234 
    | 
[0-9]? #Frourth optional 

1234 
    | 
    $ End of input. Successfull match 

Решение

/^[0-9]{1,2}([.,][0-9]{1,2})?$/ 

Regex Demo

+0

Это было так просто! Спасибо, сэр. –

+0

Неверно, если вы хотите избежать двойных нулей, таких как '00.23' –

+0

'^(0 | [1-9] [0-9] {0,1}) ([.,] [0-9] {1,2 })? $ 'будет работать как замена –

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