首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Android中使用正则表达式

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

Stack Overflow用户
提问于 2012-04-26 13:52:13
回答 5查看 83.9K关注 0票数 24

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

  1. 在小数点之前,我要输入的最大数字是3,并且不能像2,23,342等那样以零开头。
  2. 在小数点之后,我要输入的最大数字是1,如.1.3.6等。

因此,我允许用户输入的数字是2.132.5444.8564.9等。

但在我的代码中,发生的是:

  1. 它允许用户在小数点前输入三位以上的数字,如345644445555,在小数点之后不允许输入小数点。
  2. 它允许我在小数点之前输入0作为数字的开始。

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

我使用过的代码:

代码语言:javascript
复制
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                   
        }
    }
});
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-04-27 06:39:27

InputFilter中单独检查dest永远没有任何意义;这是该领域已经存在的内容。将正则表达式匹配更改为与source匹配,如果您只想检查字段是否接受某些字符,这将是合适的。但是,您需要检查字段格式,而不仅仅是逐个字符地过滤输入。这要复杂得多。

每次用户更改tempEditText的内容时,系统都会在实际更改之前调用过滤器的filter方法。它传递当前字段内容和建议的更改(可以是插入/追加、删除或替换)。变化由源CharSequence source (要添加到字段中的字符-如果有的话)、源中的范围开始和结束索引(范围不一定是source的全部)、Spanned dest (改变前的当前字段内容)以及dest中的范围dstart和dend索引表示,建议由所指示的source范围替换。

filter的工作是修改更改(如有必要),并返回一个CharSequence以(完整地)代替source使用(或返回null以继续使用source)。您需要检查更改是否会产生可接受的字段,而不是像现在这样检查dest。要做到这一点,您将需要更复杂的逻辑。(特别要注意,新字符可能是为了在末尾以外的位置插入;而且,当用户删除和添加字符时,将调用filter。)

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

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

代码语言:javascript
复制
"^([1-9][0-9]{0,2})?(\\.[0-9]?)?$"

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

编辑

以下是我对您编辑的内容的编辑:

代码语言:javascript
复制
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;
    }
});
票数 25
EN

Stack Overflow用户

发布于 2014-12-27 03:27:16

也许我的实现对任何人都有帮助:

代码语言:javascript
复制
    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);

        }
    });
票数 2
EN

Stack Overflow用户

发布于 2012-04-26 13:56:39

你可以解析这个数字,然后检查它是否小于1000,以及10*number是否为整数,而num不是。它可能也会更具可读性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10327901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档