PreviewTextInput 中的正则表达式:只有 0.0 和 1.0 之间的小数

Regex in PreviewTextInput: only decimals between 0.0 and 1.0

我想要一个正则表达式,它只允许文本框中的数字介于 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));

    }

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

@"^(?:0?\.[0-9]+|1\.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));
}

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

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

关于"^[.][0-9]+$|^[0-1.]*[.,]{0,1}[0-9]*$":第一个分支ok,第二个分支false。

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

我认为您必须考虑使用非捕获组来构建您的模式。从你的第一个模式开始似乎是最好的选择。不管怎样,首要的工作是明确定义允许的格式。