Flutter TextField如何限制用户输入:首字符为0、次字符为3或4
Flutter TextField 输入格式限制实现方案
需求说明
限制输入格式为:第一个字符必须是0,第二个字符必须是3或4,仅允许输入数字,总长度不超过12位。
正确实现方式
通过FilteringTextInputFormatter.allow配合正确的正则表达式,限定符合要求的输入内容。修改后的代码如下:
TextFormField( textAlign: TextAlign.center, enableSuggestions: false, autocorrect: false, maxLength: 12, inputFormatters: [ FilteringTextInputFormatter.digitsOnly, // 先限制仅输入数字 // 再限制格式:开头为0,第二个字符可选3/4,后续最多10位数字(总长度不超12) FilteringTextInputFormatter.allow(RegExp(r'^0[34]?[0-9]{0,10}$')), ], keyboardType: TextInputType.number, )
正则说明
r'^0[34]?[0-9]{0,10}$'的匹配规则:
^0:强制第一个字符为0[34]?:第二个字符可选(输入过程中允许只输入0),若输入则必须是3或4[0-9]{0,10}:后续可输入0-10位数字,保证总长度不超过12位$:匹配字符串结尾,确保整个输入符合规则
原代码失效原因
你之前添加的规则存在两个核心问题:
- 方法使用错误:
FilteringTextInputFormatter.deny是拒绝匹配正则的内容,而你的需求是仅允许符合规则的输入,应该用allow方法。 - 正则表达式错误:
r'^(?:[0][3-4])?[0-9]{12}$'的逻辑完全不符合需求,它匹配的是「12位任意数字」或「03/04开头加12位数字(总长度14)」,既没限制首字符为0,也无法在输入过程中逐步校验格式,自然起不到限制作用。
内容的提问来源于stack exchange,提问作者flutter 2022
相关产品推荐
相关产品推荐

