如何在Android中使用正则表达式

And*_*Dev 22 regex android android-edittext

我有一个numberDecimal EditText,我想用正则表达式验证.在验证中我想要的是:

  1. 在小数点之前,我要输入的最大数字是3,数字不应该像零一样从零开始2,23,342,等等.

  2. 小数点后,我想进入的最大数字是一个像.1,.3,.6等等.

所以,我允许用户输入的数字一样2.1,32.5,444.8,564.9,等.

但在我的代码中,会发生什么:

  1. 它允许用户在小数点前输入超过三位数更像是3456,4444,5555之后,它不会让我以后输入小数点.

  2. 它允许我0在小数点之前输入数字的开头.

那么为什么会发生这种情况,我使用的正则表达式有什么不对吗?如果有人知道,请帮我解决这个问题.

我用过的代码:

weightEditText.addTextChangedListener(new TextWatcher() 
{           
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {               
    }           
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {            
    }           
    @Override
    public void afterTextChanged(Editable s) 
    {
        Pattern mPattern = Pattern.compile("^([1-9][0-9]{0,2})?(\\.[0-9]?)?$");

        Matcher matcher = mPattern.matcher(s.toString());               
        if(!matcher.find())
        {
            weightEditText.setText(); // Don't know what to place                   
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

Ted*_*opp 24

dest在一个人中单独检查从来没有任何意义InputFilter; 这就是现场已经存在的东西.将正则表达式匹配更改为反对source,如果您只想检查字段中是否接受了某些字符,那么它是合适的.但是,您要检查字段格式,而不仅仅是逐个字符地过滤输入.这要复杂得多.

每次用户更改内容时tempEditText,系统会实际进行更改之前调用过滤器的filter方法.它传递当前字段内容和建议的更改(可以插入/追加,删除或替换).更改由源(字符 - 如果有任何 - 要添加到字段),源中的范围开始和结束索引(范围不一定全部),a (更改前的当前字段内容)表示建议将范围内的dstart和dend索引替换为指定的范围.CharSequence sourcesourceSpanned destdestsource

工作filter是修改变更(如有必要)并返回CharSequence使用(完整)代替source(或null继续使用source).dest您需要检查更改是否会产生可接受的字段,而不是像现在一样进行检查.要做到这一点,您将需要更复杂的逻辑.(特别注意,新字符可能用于插入除最后之外的某处;也filter可以在用户删除字符以及添加字符时调用.)

实现一个可能更容易TextWatcher.在它的beforeTextChanged方法中,您可以记录当前内容,并且在其afterTextChanged方法中,您可以检查(使用正则表达式)内容是否可接受,如果不是,则恢复更改前的内容.(但请确保更改前的文本是可以接受的.如果不是,请替换可接受的内容 - 比如清除字段.否则您的代码将进入无限循环,因为TextWatcher当您更正时将再次调用现场内容.)

您的正则表达式中也有错误:它允许前导零.这是一个修复此问题的改进版本(并删除了一组不必要的括号):

"^([1-9][0-9]{0,2})?(\\.[0-9]?)?$"
Run Code Online (Sandbox Code Playgroud)

(顺便说一句:你可以用\\d而不是[0-9].)

编辑

这是我对您的编辑的编辑:

weightEditText.addTextChangedListener(new TextWatcher() 
{           
    private static final Pattern sPattern
        = Pattern.compile("^([1-9][0-9]{0,2})?(\\.[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) ? new CharSequence(s) : "";
    }           

    @Override
    public void afterTextChanged(Editable s) 
    {
        if (!isValid(s))
        {
            weightEditText.setText(mText);
        }
        mText = null;
    }
});
Run Code Online (Sandbox Code Playgroud)