正则表达式匹配十进制值

时间:2013-05-29 12:45:35

标签: c# regex validation decimal

我有以下正则表达式匹配小数:

@"[\d]{1,4}([.][\d]{1,2})?"

但我可以输入多个小数点。我怎么能阻止这个?一般来说,我可以输入字符串,如“2000”或“2000.22”。我试过使用decimal.TryParse,但我可以输入两个小数点(例如2000 ..)

以下是我的课程,其中包含验证方法:

 public static class ValidationUtils
 {
    public static bool IsValid(string text)
    {
        var regex = new Regex(@"^\d{1,9}([.]\d{1,2})?$");
        var success = regex.IsMatch(text);

        return success;
    }
 }

以下是页面代码中的调用 - 求:

private void OnPreviewTextInput(object sender, TextCompositionEventArgs eventArgs)
{
    var box = eventArgs.OriginalSource as TextBox;
    if (box == null) return;
    eventArgs.Handled = !ValidationUtils.IsValid(box.Text + eventArgs.Text);
}

TextBox的xaml:

 <TextBox Text="{Binding Nominal, Mode=TwoWay,
 StringFormat={}{0:0.######}, UpdateSourceTrigger=PropertyChanged, 
 NotifyOnValidationError=True, ValidatesOnDataErrors=True,
 Converter={StaticResource  decimalValueConverter}}"
 PreviewTextInput="OnPreviewTextInput"/>

我在这里使用了错误的活动吗?

谢谢你。

3 个答案:

答案 0 :(得分:4)

您需要anchor正则表达式。

@"^\d{1,4}([.]\d{1,2})?$"

^匹配字符串的开头

$匹配字符串

的结尾

如果你不这样做,你将获得部分匹配。

答案 1 :(得分:3)

问题是你的正则表达式将匹配最后两个数字(如果它们存在),因此将字符串视为匹配。你需要锚点来告诉正则表达式,这个数字应该以最后的数字结尾。

^\d{1,4}([.]\d{1,2})$

您不需要在\d周围放置方括号,您可以使用\.来转义点,如下所示:

^\d{1,4}(\.\d{1,2})$

答案 2 :(得分:1)

你需要做一些事情。首先,您希望以^开头并以$结尾,以确保您没有任何不需要的开头或结尾字符。接下来,你将不得不逃避。使它成为文字。正如您已经注意到的那样,您会想要吗?在分组之后,#。部分不是必需的,但是允许的。

这使你的最终正则表达式如下:

@"^\d{1,4}(\.\d{1,2})?$";