在EditText中仅允许基于正则表达式的选定字符

时间:2010-11-15 01:31:40

标签: android regex user-input validation android-edittext

我想只允许用户根据我的Android应用程序中的正则表达式键入某些字符。我如何实现它?

4 个答案:

答案 0 :(得分:11)

使用TextWatcher作为@Matt Ball建议。

@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

答案 1 :(得分:1)

试试这个:如果要键入的字符匹配/ [a-zA-Z0-9 {在此处插入有效字符}] /然后允许它,否则不要。

答案 2 :(得分:1)

您可以在xml EditText上使用android:digits而不是使用正则表达式。

对于正则表达式的允许字符(数字,逗号和加号): android:digits="0123456789,+"

如果您想重复使用它,可以将字符串资源用作数字值。

答案 3 :(得分:0)

您可以使用IntentFilter进行高级过滤:

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() ?: "")
  }
})