Flutter如何设置文本输入框仅允许输入文本和表情、屏蔽特殊字符
实现方案
你原有配置的问题是正则白名单仅覆盖了英文字母,会把emoji、其他语言的普通文本全部拦截,只需要调整白名单正则的匹配范围,覆盖常规文本字符和全量emoji编码区间即可。
注意:旧版的
WhitelistingTextInputFormatter已经在新版本Flutter中废弃,官方推荐替换为FilteringTextInputFormatter.allow,两种写法的正则规则完全通用。
直接可用的代码配置
inputFormatters: [ // 新版Flutter推荐写法 FilteringTextInputFormatter.allow( RegExp( r'[\u4e00-\u9fa5a-zA-Z0-9\s\u200d\uFE0F\u2600-\u27BF\U0001F300-\U0001FAFF]' ) ), // 旧版Flutter兼容写法 // WhitelistingTextInputFormatter(RegExp(r'[\u4e00-\u9fa5a-zA-Z0-9\s\u200d\uFE0F\u2600-\u27BF\U0001F300-\U0001FAFF]')) ],
正则匹配规则说明
各段正则对应的匹配范围:
\u4e00-\u9fa5:覆盖所有常用中文字符,不需要支持中文可直接删除a-zA-Z0-9:覆盖所有大小写英文字母、阿拉伯数字\s:匹配空格、换行等常规空白字符,不需要可删除\u200d、\uFE0F:匹配emoji的零宽连接符、变体选择符,是支持组合emoji(带肤色表情、多人物家庭表情等多字符合成表情)的必要匹配项,删除会导致组合emoji输入被截断、显示异常\u2600-\u27BF:覆盖基础符号类emoji,包含天气、星座、棋牌类等基础表情\U0001F300-\U0001FAFF:覆盖补充表情平面的绝大多数emoji,包含人脸、手势、食物、动植物、物品、活动类等常用表情
注意:不要随意删除\u200d和\uFE0F两个匹配规则,否则会导致组合类emoji无法正常输入。
自定义调整方法
- 如果需要支持日文、韩文等其他语言的普通文本,直接在正则的中括号内追加对应语言的Unicode区间即可
- 如果需要放行个别业务允许的普通符号(比如逗号、句号、@等),直接把对应字符加入正则中括号即可,例如要允许中英文逗号、句号,正则可调整为:
RegExp(r'[\u4e00-\u9fa5a-zA-Z0-9\s,.,。\u200d\uFE0F\u2600-\u27BF\U0001F300-\U0001FAFF]')
内容的提问来源于stack exchange,提问作者Gilbert Aligoey
相关产品推荐
相关产品推荐

