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

WPF自定义NumericUpDown控件TextBox实时验证:0.25增量正则问题

WPF自定义NumericUpDown控件输入验证正则表达式问题

场景描述

我正在为WPF开发自定义NumericUpDown控件,需要对TextBox的用户输入进行验证。目前采用TextChanged事件实现,该事件在每次按键后触发,需确保输入数值符合设定参数。当前参数示例:

Minimum = 4400
Maximum = 5850
Increment = 0.25

需编写正则表达式,保证小数部分只能是00、25、50、75或其开头的0、2、5、7。现有正则表达式:

(\d+)(\.*)(0|2|5|7|00|25|50|75)*

存在缺陷:输入4254.3时Match仍返回成功,仅匹配到4254.,忽略了小数点后的非法数字。

问题原因与修正方案

核心问题

你的正则表达式缺少整个字符串的锚定约束,同时分组逻辑没有明确小数点与小数部分的绑定关系。原表达式只会匹配输入中的合法前缀,不会检查后续的非法字符,所以4254.3里的4254.被匹配成功,剩余的3被忽略。

修正后的正则表达式

基础版(匹配最终合法值)

^\d+(\.(0|2|5|7|00|25|50|75))?$

输入过程兼容版(支持输入中的中间状态,比如4400.、4400.2)

^\d+(\.?([0257]|00|25|50|75)?)?$

表达式解释

  • ^:强制匹配字符串的起始位置
  • \d+:匹配至少一位整数数字
  • (\.?([0257]|00|25|50|75)?)?:可选的小数部分,拆解如下:
    • \.?:允许可选的小数点(支持输入到一半的状态,比如只输入了小数点还没输数字)
    • ([0257]|00|25|50|75)?:允许的小数内容,只能是指定的单个字符(0、2、5、7)或完整的两位组合,且这部分也是可选的
  • $:强制匹配字符串的结束位置

这样修改后,输入4254.3会直接匹配失败,因为3不在允许的字符范围内,且整个输入字符串被完整校验,无法只匹配前缀部分。

内容的提问来源于stack exchange,提问作者zynovij

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 00:56:14