C# PreviewTestInput中的正则表达式:仅0.0和1.0之间的小数

C# PreviewTestInput中的正则表达式:仅0.0和1.0之间的小数,c#,regex,wpf,textbox,decimal,C#,Regex,Wpf,Textbox,Decimal,我想要一个正则表达式,它只允许文本框中0.0到1.0之间的数字 但它应该在方法PreviewTestInput(C#,WPF项目)中 所以正常的正则表达式不起作用 Regex regex = new Regex(@"^0|0.0|0\.[0-9]*|1\.0|1$"); 我发现了一个正则表达式,它允许PreviewTestInput方法中的所有小数: Regex regex = new Regex("^[.][0-9]+$|^[0-1.]*[.,]{0,1}[0-9]*$"); 如何将此正则

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

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

所以正常的正则表达式不起作用

Regex regex = new Regex(@"^0|0.0|0\.[0-9]*|1\.0|1$");
我发现了一个正则表达式,它允许PreviewTestInput方法中的所有小数:

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之间的小数,我的方法无效:


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

@"^(?:0?\.[0-9]+|1\.0)$"
0
1
也可以匹配,如果您不想匹配它们,并且必须在点后有任何数字,您可以使用

@"^(0\.\d+|1\.0+)$"
下面的代码是您想要的,当文本框失去焦点时,您需要删除最后一个
,例如
str.Trim('.')

关于
“^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之间没有字符,不需要设置范围)允许
0
1
的任何组合:
1111111
10100010
1.00.111..
。不确定在这里允许点是个好主意。
2)
[,]{0,1}
可以写入的
[,]?
:这次为什么要允许逗号?
3)
[,]{0,1}[0-9]*$
如果点(或逗号)是可选的,则此子模式可以匹配任何整数,因为
[0-9]*


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

点后一位?0和1可以匹配吗?不,点后的任何数字请检查是否适用于您。不,此正则表达式不适用于我。您似乎是在按键时使用此正则表达式,而不是在文本全部更改后使用的?您是要求
0-1
,您的意思是
“^(?:0\[0-9]| 1\.0 | 0 | 1)$”
@Entchen发布有效和无效的匹配项。此项仅允许0和1@Entchen谁说的?如果您想允许
.12
我的文本框这么说,只需将ifrst设置为0作为可选
0?
。我尝试了这个正则表达式,但我只能添加0或1,但没有点或其他数字。我以前任何时候都没有使用正则表达式,也不知道它们是如何工作的,第一个是互联网解决方案。第二个是我的try:D,那么如何为0到1之间的数字创建正则表达式呢?我允许使用逗号,因为在德国它是小数的分隔符,所以我希望用户可以选择使用点或逗号来写小数。允许的格式都是0.0和1.0之间的小数(包括)。0.0和1.0的替代格式是“0”和“1”。(所有的点都可以用逗号代替)@Entchen:即使有这样的描述,你的要求也太宽泛了!是否允许
0.0000000
?或者
.1
0.
1.
?点后可能有多少个数字?与@Avinash Raj的问题相同,它不适用于PreviewTestePut方法:(你可以现在就试试,所以我复制了你的新方法,并将“((TextBox)sender).Text=tb.Text.Trim('.);”添加到LostFocus方法中。但是TextBox只允许“0”和“1”它可以工作。但是第二个e.Handled!
@"^(0(?:\.\d+)?|1(?:\.0+)?)$"
@"^(0\.\d+|1\.0+)$"
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));
}