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