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
相关产品推荐
相关产品推荐

