如何使用Android的正则表达式(How to use regular expression in

2019-06-23 23:45发布

我有一个numberDecimal EditText ,我想使用正则表达式来验证。 在确认我要的是:

  1. 小数点之前,我想进入的最大数字是三个数字应该不喜欢从零开始2,23,342等。

  2. 小数点后,我想进入最高位是一个像.1.3.6 ,等等。

所以,我允许用户输入的数字就像是2.132.5444.8564.9 ,等等。

但在我的代码,会发生什么情况是:

  1. 它允许用户小数点像以前一样进入超过三位数以上345644445555之后,它不会让我以后输入小数点。

  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                   
        }
    }
});

Answer 1:

从未有在审查的任何一点dest在一个单独的InputFilter ; 那什么是已经存在的领域。 更改正则表达式匹配是针对source ,如果你只是想检查某些字符被接受进入该领域,将是适当的。 然而,要检查字段格式,而不只是过滤一个字符一个字符地输入。 这是更为复杂的。

每一个用户进行了更改的内容时tempEditText ,系统调用你的过滤器的filter方法之前改变实际上是由。 它通过将当前字段内容和提议的改变(其可以被插入/追加,删除或替换)。 的变化是由源表示CharSequence source (字符-如果任意到被添加到字段),范围开始和源极内端索引(范围不一定是所有的source ),一个Spanned dest (当前场在变更前的内容)和范围DSTART和DEND索引dest被提出,由所指示的替换source范围。

的工作filter是修改的变化(如有必要)和返回CharSequence使用(将其全部)代替source (或null先走,并用source )。 而不是检查dest ,你现在所做的,你将需要检查的变化是否会导致一个可接受的领域。 要做到这一点,你需要更复杂的逻辑。 (请注意,特别地,该新的字符(一个或多个)可被用于插入某处比在端部以外;还有, filter 。当用户删除字符以及将其添加将被称为)

这可能是更容易实现TextWatcher 。 在它的beforeTextChanged方法,你可以记录当前的内容和它的afterTextChanged方法,您可以检查(使用正则表达式)的内容是否是可以接受的,如果没有,恢复之前,该变更内容。 (确保,虽然,改变之前的文本是可以接受的,如果不是,替补接受的东西,如清除该字段。否则,你的代码将进入一个无限循环,因为TextWatcher将被再次当你调用更正字段内容。)

您还可以在您的正则表达式的错误:它允许前导零。 下面是修复此问题(并删除一组不必要的括号)的改进版本:

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

(顺便说一句:可以使用\\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;
    }
});


Answer 2:

也许我的实施将帮助任何人:

    etRepeaterCallsign.addTextChangedListener(new TextWatcher() {
        private final Pattern sPattern
                = Pattern.compile("^([A-Z]{0,2})?(\\d)?([A-Z-]{0,5})"); // ^([1-9][0-9]{0,2})?(\\.[0-9]?)?$

        private CharSequence mText;

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

        @Override
        public void beforeTextChanged(CharSequence r, int start, int count,
                                      int after) {
            mText = r.toString();
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            bIsEdit = true;
        }
        @Override
        public void afterTextChanged(Editable s) {
            etRepeaterCallsign.removeTextChangedListener(this);

            int iCursorPosition = etRepeaterCallsign.getSelectionStart();
            etRepeaterCallsign.setText("");
            if (isValid(s))
                etRepeaterCallsign.append(s);
            else
                etRepeaterCallsign.append(mText);

            etRepeaterCallsign.setSelection(iCursorPosition);

            etRepeaterCallsign.addTextChangedListener(this);

        }
    });


Answer 3:

你可以只解析数,并检查它是<1000和10 *号是一个整数,而num是不是。 它可能会更可读了。



Answer 4:

你可以尝试这样的事: ^[1-9][0-9]{0,2}(\\.\\d)?$ 这应该与任何数量的不与0(开始^[1-9]并随后在最多两个数( [0-9]{0,2} 正则表达式还允许一个可选的十进制值( (\\.\\d)?$ )。

话虽这么说,最好你应该将字符串值解析到一个doublefloat ,让你需要用实际数值进行什么都验证。

为了解析您的string成一个double价值,你就需要使用Double.parseDouble(String s)将像这样: double myValue = Double.parseDouble(EditText.getText());



Answer 5:

我用我的代码如下尝试你的格局。 它完美的作品为2.1,32.5,444.8,564.9等等。

我的代码:

public class WebPush extends Activity {  
    EditText editTxt;
    private TextView regresult;  

    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main); 

        editTxt = (EditText) findViewById(R.id.editID);
        regresult = (TextView) findViewById(R.id.txtID);

        String urName = editTxt.getText().toString();
        editTxt.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,int arg3) {
            }       

            @Override
            public void afterTextChanged(Editable s) {
                if (editTxt.getText().toString().matches("(^([0-9]{0,3})?)(\\.[0-9]{0,1})?$"))
                {
                    regresult.setText("");
                }
                else
                {
                    regresult.setText("invalid number");
                }
            }
        });
    }
}


文章来源: How to use regular expression in Android