You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 09:32:24