I'd like to have a regex, which only allows digits between 0.0 and 1.0 in a textbox.
BUT it should be in the method PreviewTextInput (C#, WPF project)
So the normal regex doesn't work
Regex regex = new Regex(@"^0|0.0|0\.[0-9]*|1\.0|1$");
I've found a regex, which allows all decimals in the PreviewTextInput method:
Regex regex = new Regex("^[.][0-9]+$|^[0-1.]*[.,]{0,1}[0-9]*$");
How can a change this regex to only accept decimals between 0-1?
Thanks.
My method for decimals:
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));
}
My method for decimals between 0-1 (doesn't work):
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));
}
About
@"^0|0.0|0\.[0-9]*|1\.0|1$"
: there are two mistakes:1) one of the dot is not escaped, so it can match any characters.
2) The
^
and$
are only respectively in the first and last branches of your alternation, but are not in factor with each branch. To do that you must put all branches in a non capturing group.About
"^[.][0-9]+$|^[0-1.]*[.,]{0,1}[0-9]*$"
: the first branch is ok, the second branch is false.1)
[0-1.]*
that can be written[01.]*
(there is no characters between 0 and 1, no need to put a range) allow any combination of0
,1
and.
:1111111111
,10100010
or1.00.111..
. Not sure that allowing the dot here is a good idea.2)
[.,]{0,1}
that can be written[.,]?
: why this time you want to allow the comma?3)
[.,]{0,1}[0-9]*$
if the dot (or the comma) is optional, this subpattern can match any integer because of the[0-9]*
.I think you must consider using non-capturing groups to build your pattern. Starting from your first pattern seems to be the best option. Anyway, the first job is to clearly define what are the allowed formats.
0
and1
also can be matched,if you don't want match them,and must have any digits after dot ,you can useThe code below is what you want,and you need to remove the last
dot
when the textbox lost focus,such asstr.Trim('.')
You may try this regex.