C# 正则表达式不允许十进制的文本框检查

C# 正则表达式不允许十进制的文本框检查,c#,regex,winforms,validation,textbox,C#,Regex,Winforms,Validation,Textbox,我想创建一个TextChanged事件,检查输入文本是否符合特定条件,如果不符合,则删除最后输入的字符。在这种情况下,标准是数字、1个小数和1个分数 我在测试一个正则表达式,只测试数字和小数,结果遇到了一个问题。我尝试过几种不同的表达方式(我自己写的很糟糕,所以它们是从其他各种堆栈溢出问题中挑选出来的),每次的结果都是一样的。它只接受数字,但不接受小数。任何帮助都将不胜感激 string isNumber = @"^\d{1,9}(\.\d{1,9})?$";

我想创建一个TextChanged事件,检查输入文本是否符合特定条件,如果不符合,则删除最后输入的字符。在这种情况下,标准是数字、1个小数和1个分数

我在测试一个正则表达式,只测试数字和小数,结果遇到了一个问题。我尝试过几种不同的表达方式(我自己写的很糟糕,所以它们是从其他各种堆栈溢出问题中挑选出来的),每次的结果都是一样的。它只接受数字,但不接受小数。任何帮助都将不胜感激

        string isNumber = @"^\d{1,9}(\.\d{1,9})?$";

        private void TextBox_TextChanged(object sender, EventArgs e)
        {
            TextBox text = (TextBox)sender;

            Match match = Regex.Match(text.Text, isNumber);

            if (!match.Success)
            {
                if (text.Text.Length > 1)
                    text.Text = text.Text.Substring(0, text.Text.Length - 1);
                else
                    text.Text = "";

                text.Select(text.Text.Length, 0); //set cursor to the end 
                                                  //of the string
            }
        }

我认为问题在于,您试图在用户键入数字时逐个字符验证数字,但如果该值暂时不是无效值,则无法键入有效的十进制数字

考虑用户键入值时发生的情况
1.2

  • 用户键入字符
    1
  • 由于文本框的值已更改,因此激发验证
  • 1
    是有效的小数,因此验证通过
  • 用户继续键入,添加小数点字符
  • 验证再次激发,因为文本框的值已更改
  • 1。
    根据正则表达式不是有效的小数,因此最后一个字符将被删除
  • 文本框的值现在返回到
    1
  • 用户会感到沮丧。转到第4步
  • 如您所见,不可能输入小数点。但是,如果您试图更改正则表达式以允许小数点不包含以下数字,那么如果用户在键入小数点后停止,然后提交表单,则可能会出现无效值


    所以关键是,使用逐字符验证方案对小数不起作用。更好的方法是允许用户在框中输入他们想要的任何内容,然后在用户完成键入后进行验证。您可以通过验证文本框何时失去焦点或表单何时提交来实现这一点。

    这不是最漂亮的,但它似乎可以满足您的需要:

    ^(\d{1,9}\.|)\d{1,9}(\.(\d{1,9})?)$
    

    我应该注意的是,对于以十进制开头的数字来说,这是行不通的。

    至少有一个问题是,您正在尝试做什么(以及如何做)(就像brian指出的那样),您可能指的是只允许文本框的前3个字符成为格式“1.3”的内容例如,如果该位置的字符不正确,则删除该字符。 如果您真的打算这样做,您可以这样做(如果用户在成功放置另一个字符(在本例中为第四个字符)后,我没有放置任何代码):


    正如您所见,我逐字符检查,直到长度达到3,然后检查正则表达式。

    谢谢您的回答!现在,这是完全有道理的=D
            string isNumber = @"^[1-9]{1}\.[1-9]{1}$";
            private void textBox1_TextChanged(object sender, EventArgs e)
            {
                TextBox text = (TextBox)sender;
    
                Match match;
    
                switch (text.Text.Length)
                {
                    case 1:
                        if (char.IsDigit(text.Text[0]))
                            break;
                        else
                            text.Text = "";
                        break;
                    case 2:
                        if (char.IsPunctuation(text.Text[1]))
                            break;
                        else
                        {
                            text.Text = text.Text.Remove(text.Text.Length - 1, 1);
                            text.Select(text.Text.Length, 0); 
                        }
                        break;
                    case 3:
                        match = Regex.Match(text.Text, isNumber);
                        if (!match.Success)
                        {
                            text.Text = text.Text.Remove(text.Text.Length - 1);
                            text.Select(text.Text.Length, 0); 
                        }
                        else
                            MessageBox.Show("Success!!!!!");
                        break;
                }
    
            }