C# WPF TextBox正则表达式项目中失效,在线测试正常
问题1:数字-数字格式输入限制修复
你的第一个正则表达式问题出在正向预查(?=-)——它强制要求前面的数字后必须紧跟-,但输入过程中(比如先输入单个数字"1")并不满足这个条件,导致所有输入被拦截。
修正后的正则与代码
调整正则以支持输入过程中的中间状态(比如输入"123-"、"23"这类临时内容),同时最终匹配123-456或23-234格式:
private void Test1(object sender, TextCompositionEventArgs e) { var textBox = e.Source as TextBox; var newText = (textBox?.Text ?? "") + e.Text; // 允许:空文本、1-3位数字、1-3位数字+-、1-3位数字+-+1-3位数字 if (!Regex.IsMatch(newText, @"^[0-9]{0,3}(-?[0-9]{0,3})?$")) { e.Handled = true; } }
这个正则会匹配所有合法的输入阶段,从单个数字到完整的xxx-xxx格式。
问题2:带逗号和x的格式输入限制修复
你的第二个正则要求第一个字符必须是数字/逗号,紧接着就是x,但实际需求是x可以出现在一段带逗号的数字之后(比如"2,2x1"),原正则无法匹配"2,2"这类前置内容,导致输入到一半被拦截。
修正后的正则与代码
调整正则以支持:前置带逗号的数字序列、中间的x、后置带逗号的数字序列,同时避免单独出现逗号:
private void Test2(object sender, TextCompositionEventArgs e) { var textBox = e.Source as TextBox; var newText = (textBox?.Text ?? "") + e.Text; // 允许:空文本、纯数字序列(可带逗号分隔)、数字序列+x、数字序列+x+数字序列 if (!Regex.IsMatch(newText, @"^$|^[0-9]+(,[0-9]+)*$|^[0-9]+(,[0-9]+)*x$|^[0-9]+(,[0-9]+)*x[0-9]+(,[0-9]+)*$")) { e.Handled = true; } }
这个正则会匹配你需要的所有格式,比如1x21、2,2x1、3,3x1,2、33x1,1。如果需要允许输入逗号后临时停顿(比如先输入"2,"再继续输入数字),可以把正则调整为:
^$|^[0-9]+(,[0-9]*)*$|^[0-9]+(,[0-9]*)*x$|^[0-9]+(,[0-9]*)*x[0-9]+(,[0-9]*)*$
额外提示
- 若要处理粘贴操作,仅靠
TextComposition事件不够,还需监听DataObject.Pasting事件验证粘贴内容。 - 正则前加
@符号可避免转义字符冲突,建议始终使用。
内容的提问来源于stack exchange,提问作者Andrzej Dach
相关产品推荐
相关产品推荐

