让EditText只用特定的单词写

时间:2016-06-01 13:54:53

标签: android regex android-edittext android-input-filter

除了一个预定义的单词外,你怎么能限制EditText

让我们说输入应该是" Hello" (忽略大小写)。因此,除了来自"你好"的字母之外,字母将被忽略。以尊重的顺序。

我真的不想使用TextWatcher并在位置手动检查字符。我想知道如何使用InputFilterRegex来做到这一点?

我尝试了什么:

    InputFilter onboardingFilter = new InputFilter() {
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        for (int i = start; i < end; i++) {
            String checkMe = String.valueOf(source.charAt(i));

            Pattern pattern = Pattern.compile("hello", Pattern.CASE_INSENSITIVE);
            Matcher matcher = pattern.matcher(checkMe);
            boolean valid = matcher.matches();
            if(!valid){
                return "";
            } 
        }
        return null;
    }
};

这不允许我输入任何内容。我相信这个问题在正则表达式中。

1 个答案:

答案 0 :(得分:1)

首先,你在每个角色上运行正则表达式'hello'(在这种情况下,h,e,l,l,o,单独)。但是,它永远不会通过h,因为字符'h'找不到正则表达式'hello'。

其次,你永远不会返回用户输入的实际String,因此它总是一个空字符串。

第三,既然我们知道预期的模式而不是输入,你实际上可以反转它并使用输入作为模式在目标模式中搜索并使用正则表达式start-with(^)来确保排序。

尝试这样的事情:

private String last = "";

InputFilter onboardingFilter = new InputFilter() {
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        String sourceAsRegex = "^" + source;
        String desiredInput = "hello";

        Pattern pattern = Pattern.compile(sourceAsRegex, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(desiredInput);

        if(matcher.find())
            last = source;

        return last;
    }
};