Jetpack Compose中TextField正则表达式不符合预期问题排查
Jetpack Compose TextField 输入格式限制解决方案
你的问题出在原正则表达式只允许最终完成的有效格式,但用户输入是逐步进行的(比如输入小数点后还没输入小数位),这种中间状态会被原正则拦截,导致无法继续输入。结合你的规则,我们需要调整正则以支持输入过程中的合法中间状态,同时严格满足格式要求。
修正后的实现代码
var text by remember { mutableStateOf("") } // 正则规则:首字符非0/点,点前最多4位数字,点后最多2位,允许输入"123."这类中间状态 val inputRegex = remember { Regex("^[1-9]\\d{0,3}(?:\\.\\d{0,2})?$") } TextField( label = { Text(stringResource(R.string.label_days)) }, value = text, keyboardOptions = KeyboardOptions( keyboardType = KeyboardType.Number ), onValueChange = { input -> // 空字符串直接允许,否则校验正则 if (input.isEmpty() || inputRegex.matches(input)) { text = input } } )
正则规则说明
^[1-9]\\d{0,3}(?:\\.\\d{0,2})?$ 拆解:
^[1-9]:首字符必须是1-9的数字,直接排除0或点开头的情况\\d{0,3}:首字符后可以跟0-3位数字,保证点前总共最多4位(?:\\.\\d{0,2})?:可选的小数部分,允许:- 不输入小数点(无小数)
- 输入小数点但后面不跟数字(比如"123.")
- 输入小数点后跟1-2位数字(比如"123.4"、"123.45")
$:匹配字符串结尾,避免多余字符
验证规则匹配情况
- 有效输入:
8956.32、45、562.2、123.(中间状态) - 无效输入:
0655、0356.00、.003、12345(超过4位整数)、12.345(超过2位小数)
内容的提问来源于stack exchange,提问作者user13926345
相关产品推荐
相关产品推荐

