PreviewTextInput中的正则表达式:仅0.0到1.0之间的小数

时间:2015-07-14 12:28:07

标签: c# regex wpf textbox decimal

我想要一个正则表达式,它只允许文本框中的数字介于0.0和1.0之间。

但它应该在方法PreviewTextInput(C#,WPF项目)

因此正常的正则表达式不起作用

Regex regex = new Regex(@"^0|0.0|0\.[0-9]*|1\.0|1$");

我找到了一个正则表达式,它允许PreviewTextInput方法中的所有小数:

Regex regex = new Regex("^[.][0-9]+$|^[0-1.]*[.,]{0,1}[0-9]*$");

如何将此正则表达式更改为仅接受0-1之间的小数?

感谢。

我的小数方法:

private void tb_PreviewTextInput(object sender, TextCompositionEventArgs e)
    {
        Regex regex = new Regex("^[.][0-9]+$|^[0-1.]*[.,]{0,1}[0-9]*$");
        e.Handled = !regex.IsMatch((sender as TextBox).Text.Insert((sender as TextBox).SelectionStart, e.Text));
    }

我的0-1之间的小数方法(不起作用):

        private void tb_Surface_PreviewTextInput(object sender, TextCompositionEventArgs e)
    {
        Regex regex = new Regex(@"^(0?\.[0-9]+|1\.0)$");
        e.Handled = !regex.IsMatch(e.Text);
       // e.Handled = !regex.IsMatch((sender as TextBox).Text.Insert((sender as TextBox).SelectionStart, e.Text));

    }

3 个答案:

答案 0 :(得分:1)

你可以试试这个正则表达式。

@"^(?:0?\.[0-9]+|1\.0)$"

答案 1 :(得分:1)

关于@"^0|0.0|0\.[0-9]*|1\.0|1$":有两个错误:

1)其中一个点未转义,因此可以匹配任何字符  2)^$分别只在交替的第一个和最后一个分支中,但不在每个分支的因子中。为此,您必须将所有分支放在非捕获组中。

关于"^[.][0-9]+$|^[0-1.]*[.,]{0,1}[0-9]*$":第一个分支没问题,第二个分支是假的。

1)[0-1.]*可写[01.]* (0到1之间没有字符,无需放置范围)允许{{1}的任意组合},01.111111111110100010。不确定在这里允许点是个好主意。
2)1.00.111..可写[.,]{0,1}:为什么这次你想要逗号? 3)[.,]?如果点(或逗号)是可选的,由于[.,]{0,1}[0-9]*$,此子模式可以匹配任何整数。

我认为你必须考虑使用非捕获组来构建你的模式。从你的第一个模式开始似乎是最好的选择。无论如何,第一项工作是明确定义允许的格式。

答案 2 :(得分:0)

@"^(0(?:\.\d+)?|1(?:\.0+)?)$"

01也可以匹配,如果您不想匹配它们,并且必须在点后有任何数字,您可以使用

@"^(0\.\d+|1\.0+)$"

以下代码是您想要的,您需要在文本框失去焦点时删除最后一个dot,例如str.Trim('.')

private void tb_Surface_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
    var patten = @"^(0(\.\d*)?|1(\.0*)?)$";
    Regex regex = new Regex(patten);
    e.Handled = !regex.IsMatch(e.Text);
    // e.Handled = !regex.IsMatch((sender as TextBox).Text.Insert((sender as TextBox).SelectionStart, e.Text));
}