EditText 限制输入特殊字符:单引号、双引号和表情符号

swe*_*man 3 regex android android-edittext

我在从editText 将特殊字符插入数据库时​​遇到问题:单引号、双引号和表情符号。

我希望我的 editText 限制这些字符,并且我成功地限制了表情符号,但我未能限制用户输入单引号和双引号。

例如,当我尝试将Today's ListeditText 中的文本输入数据库时,它会生成异常。

我在 editText 中使用 InputFilter 来过滤表情符号,我希望这个过滤器也限制单引号和双引号。

public static InputFilter getEditTextFilterEmoji() {
    return new InputFilter() {

        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {

            CharSequence sourceOriginal = source;
            source = replaceEmoji(source);
            end = source.toString().length();

            if (end == 0)
                return ""; //Return empty string if the input character is already removed

            if (!sourceOriginal.toString().equals(source.toString())) {
                char[] v = new char[end - start];
                TextUtils.getChars(source, start, end, v, 0);

                String s = new String(v);

                if (source instanceof Spanned) {
                    SpannableString sp = new SpannableString(s);
                    TextUtils.copySpansFrom((Spanned) source, start, end, null, sp, 0);
                    return sp;
                } else {
                    return s;
                }
            } else {
                return null; // keep original
            }
        }

        private String replaceEmoji(CharSequence source) {

            String notAllowedCharactersRegex = "[^a-zA-Z0-9@#\\$%\\&\\-\\+\\(\\)\\*;:!\\?\\~`£\\{\\}\\[\\]=\\.,_/\\\\\\s'\\\"<>\\^\\|÷×]";
            return source.toString()
                    .replaceAll(notAllowedCharactersRegex, "");
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

谁能帮我这个 ?

Dee*_*pak 5

根据我的理解,所有表情符号都包含 /u 所以我是这样使用的

public static InputFilter[] getEmojiFilter(String blockChars) {
    return new InputFilter[]{(source, start, end, dest, dstart, dend) -> {
        String source1= StringEscapeUtils.escapeJava(source.toString());
        for (int i = start; i < end; i++) {
            if (source != null && blockChars.contains("" + source1.charAt(i))) {
                return source.subSequence(start, i);
            }
        }
        return null;
    }};
}
Run Code Online (Sandbox Code Playgroud)

并在下面为 Edittext 写下一行

editext.setFilters(getEmojiFilter("'\"\\//\\u"));
Run Code Online (Sandbox Code Playgroud)