Java正则实现EditText输入过滤:禁止字符串开头带空格(兼容JDK8)
问题说明
需要为Java 8环境下Android平台的EditText实现输入过滤器,匹配规则如下:
- 允许:首字符为非空格,后续可包含任意字符(特殊符号、数字、字母、空格均可)
- 允许:字符串末尾带任意数量空格
- 禁止:字符串开头带任意数量空格
匹配样例:
- 匹配:
John is $@^&%$#@&$^12(random chars...) - 匹配:
John is $@^&%$#@&$^12(random chars...)(末尾存在若干空格) - 不匹配:
John is $@^&%$#@&$^12(random chars...)(开头存在若干空格)
报错原因
开发中遇到的'\s' and '\' escape sequences are not supported at language level '8'、Illegal escape character in string literal报错,核心原因是Java字符串语法要求正则中的转义字符必须使用双反斜杠\\,直接写单反斜杠开头的\s、\w属于Java字符串层面的非法转义,Java 8不识别这类转义序列。
此前尝试的方案存在三类问题:
- 部分正则人为限制了可输入的字符范围,会拦截合法的特殊符号
- 部分正则逻辑不完整,要么无法覆盖末尾带空格的场景,要么无法正确拦截开头空格
- InputFilter实现逻辑存在缺陷:仅校验输入片段而非变更后的完整文本,无法覆盖光标在中间插入内容的场景;构造函数中反复给Pattern变量赋值,前面编译的正则全部无效。
实现方案
正确正则(Java 8兼容)
直接使用如下正则即可满足所有匹配规则,无转义兼容问题:
"^[^ ].*$"
正则逻辑说明:
^:匹配字符串起始位置[^ ]:校验第一个字符为非半角空格的任意字符,直接拦截开头带空格的输入.*:匹配后续任意数量的任意字符(支持特殊符号、空格、中英文、数字,无额外限制)$:匹配字符串结束位置
如果需要同时拦截开头的全角空格、制表符等所有空白字符,可替换为转义正确的正则,不会触发Java 8报错:
"^[^\\s].*$"
完整InputFilter实现
修正原有逻辑缺陷,拼接输入变更后的完整文本再做校验,覆盖所有输入场景:
private static class NoSpaceStartInputFilter implements InputFilter { private final Pattern mPattern = Pattern.compile("^[^ ].*$"); @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { // 拼接本次输入变更后的完整文本 StringBuilder newContent = new StringBuilder(dest); newContent.replace(dstart, dend, source.subSequence(start, end).toString()); // 全文本匹配校验 if (!mPattern.matcher(newContent).matches()) { // 不符合规则则拦截本次输入 return ""; } // 符合规则放行 return null; } } // 给EditText设置过滤器的代码 final EditText nameInput = line2.findViewById(R.id.input_value); nameInput.setFilters(new InputFilter[] {new NoSpaceStartInputFilter()});
内容的提问来源于stack exchange,提问作者radus14
相关产品推荐
相关产品推荐

