在Android中如何使用正则表达式
在Android中如何使用正则表达式
我有一个numberDecimal的EditText,我想使用正则表达式对其进行验证。在验证过程中,我想要的是:
- 小数点之前,我想要输入的最大数字是三位,并且数字不应以零开头,如2、23、342等。
- 小数点之后,我想要输入的最大数字是一位,如.1、.3、.6等。
所以我允许用户输入的数字是2.1、32.5、444.8、564.9等。
但是在我的代码中发生了以下问题:
- 它允许用户输入三位以上的数字,在小数点之前,如3456、4444、5555,之后它不允许我输入小数点。
- 它允许我在小数点之前输入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(); // 不知道填什么 } } });
如何在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]?)?——小数点后面跟着一个可选数字,它们都是可选的。
卡住了的键盘。
什么是卡住的键盘?日志中有什么内容吗?是否有循环?尝试使用调试器设置断点来诊断发生了什么。
如何在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中使用正则表达式的一些简单示例和说明。希望这篇文章对你有所帮助!