在 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 
      ""
    
  

然后将其添加到EditTextTextInputEditText,如下所示:

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 中仅允许基于正则表达式的选定字符的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式检查句子中仅包含字母的两个单词

正则表达式 - 从字符串中仅获取十进制数

使用 C# 中的正则表达式操作检查 EditText 上的有效电子邮件 [关闭]

基于正则表达式在闪亮的 DT 中突出显示单词

如何在 C# 中使用正则表达式检索选定的文本?

在此上下文中仅允许返回数字或布尔值的变量表达式