自定义输入过滤器接受正则表达式中的数字值

时间:2017-07-01 07:20:50

标签: java android regex

public class FilterActivity implements InputFilter {
Pattern pattern;

public FilterActivity(int beforeDecimal) {
    pattern=Pattern.compile("([0-9]{0,"+(beforeDecimal-1)+"})?");
}

@Override
public CharSequence filter(CharSequence charSequence, int start, int end, Spanned spanned, int spanstart, int spanend) {
    Matcher matcher=pattern.matcher(spanned);
    if(!matcher.matches()){
        return "";
    }
    return null;
}
}

当更改或编辑字段时,它接受a,2a我只需要接受0-9

editText.setFilters(new InputFilter[]{new FilterActivity(3)});

我知道android “number Decimal and number”中的属性,但我尝试使用正则表达式来解决这个问题。

2 个答案:

答案 0 :(得分:1)

我同意@horcrux但我认为因为你的乘数从0开始,你可以省略“?”:

"^([0-9]{0,"+(beforeDecimal-1)+"})$"

如果你不需要捕捉结果,你甚至可以省略括号:

"^[0-9]{0,"+(beforeDecimal-1)+"}$"

但你需要锚点(^和$)来表示比赛的左侧或右侧可能没有任何内容。

@Raj如果我正确理解你对@horcrux的答案,那么你在数字后面有可选字母吗? 尝试:

"^([0-9]{0,"+(beforeDecimal-1)+"}[a-z]?)$"

或:

"^([0-9]{0,"+(beforeDecimal-1)+"}[a-zA-Z]?)$"

如果它们也可以是大写

答案 1 :(得分:0)

尝试

    public class FilterActivity implements InputFilter {
      public FilterActivity(int beforeDecimal) { }

      @Override
      public CharSequence filter(CharSequence charSequence, int start, int end, Spanned spanned, int spanstart, int spanend) {
           for (int i = start; i < end; i++) {
               if (!Character.isDigit(charSequence.charAt(i))) {
                     return "";
               }
            }
            return null;
     }
}