我想要一个正则表达式,它只允许文本框中的数字介于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 :(得分: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}的任意组合},0
和1
:.
,1111111111
或10100010
。不确定在这里允许点是个好主意。
2)1.00.111..
可写[.,]{0,1}
:为什么这次你想要逗号?
3)[.,]?
如果点(或逗号)是可选的,由于[.,]{0,1}[0-9]*$
,此子模式可以匹配任何整数。
我认为你必须考虑使用非捕获组来构建你的模式。从你的第一个模式开始似乎是最好的选择。无论如何,第一项工作是明确定义允许的格式。
答案 2 :(得分:0)
@"^(0(?:\.\d+)?|1(?:\.0+)?)$"
0
和1
也可以匹配,如果您不想匹配它们,并且必须在点后有任何数字,您可以使用
@"^(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));
}