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

13 浏览
0 Comments

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

我有一个numberDecimal的EditText,我想使用正则表达式对其进行验证。在验证过程中,我想要的是:

  1. 小数点之前,我想要输入的最大数字是三位,并且数字不应以零开头,如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(); // 不知道填什么
        }
    }
});

0
0 Comments

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

问题的出现原因:有人想知道在Android中如何使用正则表达式。

解决方法:提供一个例子来解释如何使用正则表达式。

0
0 Comments

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

在一个InputFilter中,检查dest没有任何意义,因为这就是字段中已经存在的内容。更改正则表达式匹配以针对source,并且如果您只想检查某些字符是否被接受到字段中,则会更合适。但是,您想要检查字段的格式,而不仅仅是按字符过滤输入。这更加复杂。

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

filter的任务是修改更改(如果需要)并返回要在source的位置(完整地)使用的CharSequence(或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();

}

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

}

public void beforeTextChanged(CharSequence s, int start, int count,

int after){

mText = isValid(s) ? new CharSequence(s) : "";

}

public void afterTextChanged(Editable s)

{

if (!isValid(s))

{

weightEditText.setText(mText);

}

mText = null;

}

});

我已经编辑了我的回答并使用TextWatcher进行了操作。但是无法找到在beforeTextChanged方法中写什么的线索。请查看我的编辑回答并告诉我应该做什么。

首先,将您的模式匹配移动到一个单独的方法中(例如isValid)。然后在TextWatcher中声明一个字段来存储更改之前的文本:

class MyTextWatcher {

private CharSequence mText;

...

public void beforeTextChanged (CharSequence s, int start, int count, int after) {

mText = isValid(s) ? new CharSequence(s) : "";

}

}

最后,在afterTextChanged中,如果测试失败,请调用weightEditText.setText(mText)。此外,在退出afterTextChanged之前始终设置mText = null,因为现在该值没有用了。

我还会将mPattern设置为static final字段;没有必要多次编译它。

它工作了...非常感谢...最后一个问题是,有可能将模式更改为不允许小数点作为数字的开头。

可以的:"^([1-9][0-9]{0,2}(\\.[0-9]?)?)?$"。(顺便说一句,我已经在示例代码中更新了我的答案。很高兴您已经让它工作了。)

@ Ted Hopp哇,太棒了...它可以正常工作并检查所有验证...但是我想知道?的用途是什么...为什么删除?可以解决问题...您能解释一下每个术语吗?

我没有删除它。我将其移到整个模式的末尾。顶级模式是:^(something)?$,换句话说,something是可选的,空字符串匹配。在括号内,something分解为两部分:[1-9][0-9]{0,2}——非零数字后面跟着多达2个数字——以及(\\.[0-9]?)?——小数点后面跟着一个可选数字,它们都是可选的。

卡住了的键盘。

什么是卡住的键盘?日志中有什么内容吗?是否有循环?尝试使用调试器设置断点来诊断发生了什么。

0
0 Comments

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

在Android开发中,正则表达式是一种用于匹配和处理文本的强大工具。它可以用于验证输入的数据、搜索和替换文本,以及从字符串中提取特定的信息。

在上面的代码中,我们使用了正则表达式来验证输入的文本。在这个例子中,我们定义了一个匹配特定模式的正则表达式,该模式用于验证输入的呼号是否符合特定的规则。如果输入的呼号符合规则,我们就将其显示在输入框中,否则将显示之前正确的呼号。

要使用正则表达式,我们需要使用Java中的Pattern和Matcher类。在上面的代码中,我们使用了Pattern.compile方法来编译正则表达式,并使用matcher方法来匹配输入的文本。

为了在Android中使用正则表达式,我们需要在项目中添加正则表达式的支持。在build.gradle文件中,我们可以添加以下依赖项:

dependencies {

implementation 'org.apache.commons:commons-lang3:3.12.0'

}

这将添加Apache Commons Lang库,其中包含了一些常用的正则表达式工具类。

在使用正则表达式时,我们需要注意一些常见的符号和语法。例如,"^"表示匹配字符串的开头,"$"表示匹配字符串的结尾。"[A-Z]"表示匹配任何大写字母,"{0,2}"表示匹配前面的模式0到2次。

通过使用正则表达式,我们可以轻松地验证和处理输入的文本。无论是验证手机号码、邮箱地址,还是提取URL中的参数,正则表达式都可以帮助我们快速实现这些功能。

在Android开发中,正则表达式是一种强大的工具,用于匹配和处理文本。

要使用正则表达式,我们需要使用Pattern和Matcher类。

在Android项目中添加正则表达式的支持,可以使用Apache Commons Lang库。

通过使用正则表达式,我们可以轻松地验证和处理输入的文本。

以上就是如何在Android中使用正则表达式的一些简单示例和说明。希望这篇文章对你有所帮助!

0