在 EditText 中仅允许基于正则表达式的选定字符
Posted
技术标签:
【中文标题】在 EditText 中仅允许基于正则表达式的选定字符【英文标题】:Allow only selected charcters based on regex in an EditText 【发布时间】:2011-05-10 00:12:15 【问题描述】:我希望仅允许用户根据我的 android 应用程序中的正则表达式键入某些字符。如何实现?
【问题讨论】:
Android: How can I validate EditText input? 的可能副本。另请参阅this question。 基于正则表达式?你的意思是允许的字符列表?这不是正则表达式。 @Falmarri 就是这样 - [[\\d]\\,\\+]* 【参考方案1】:按照@Matt Ball 的建议使用TextWatcher
。
@Override
public void afterTextChanged(Editable s)
String text = s.toString();
int length = text.length();
if(length > 0 && !Pattern.matches(PATTERN, text))
s.delete(length - 1, length);
编辑
尽管TextWatcher
有效,但使用InputFilter
会更干净。检查这个example。
【讨论】:
这对我帮助很大,谢谢我刚刚遇到问题,当用户删除一个字符并且它没有进入 PATTERN 因为越界而崩溃所以你可以使用它(有一些修改对于我的应用程序) if(text.length()>0) int length = text.length(); if (!getPattern().equals("")) if (!Pattern.matches(getPattern(),text)) s.delete(length - 1, length); 【参考方案2】:试试这个:如果要输入的字符匹配 /[a-zA-Z0-9在此处插入有效字符]/ 则允许,否则不要。
【讨论】:
【参考方案3】:您可以在 xml EditText 上使用 android:digits
而不是使用正则表达式。
对于您允许的正则表达式字符(数字、逗号和加号):
android:digits="0123456789,+"
如果你想重用它,你可以使用字符串资源作为数字值。
【讨论】:
【参考方案4】:您可以使用InputFilter
进行高级过滤:
class CustomInputFilter : InputFilter
private val regex = Pattern.compile("^[A-Z0-9]*$")
override fun filter(
source: CharSequence,
start: Int,
end: Int,
dest: Spanned?,
dstart: Int,
dend: Int
): CharSequence?
val matcher = regex.matcher(source)
return if (matcher.find())
null
else
""
然后将其添加到EditText
或TextInputEditText
,如下所示:
textInputLayout.editText!!.filters += CustomInputFilter()
//or
editText.filters += CustomInputFilter()
请记住,如果您有 TextWatcher
,这不会阻止 TextWatcher
触发,您可以过滤掉这些事件,检查上一个和下一个文本值是否相同。
类似:
//addTextChangedListener is an extension function available in core-ktx library
textInputLayout.editText!!.addTextChangedListener(afterTextChanged = editable ->
val editTextValue = viewModel.editTextLiveData.value ?: ""
if (!editTextValue.equals(editable))
viewModel.updateEditTextValue(editable?.toString() ?: "")
)
【讨论】:
从您的第一行开始:您可以使用IntentFilter
进行高级过滤:应该是InputFilter
对吧?
@ShailendraMadda 是的,这是一个错字。我现在修好了,谢谢:)以上是关于在 EditText 中仅允许基于正则表达式的选定字符的主要内容,如果未能解决你的问题,请参考以下文章