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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 04:06:25