3

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

@"[\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"/>

我在这里使用了错误的事件吗?

谢谢。

4

3 回答 3

5

你需要锚定你的正则表达式。

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

^匹配字符串的开头

$匹配字符串的结尾

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

于 2013-05-29T12:47:59.130 回答
3

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

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

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

^\d{1,4}(\.\d{1,2})$
于 2013-05-29T12:49:08.803 回答
1

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

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

@"^\d{1,4}(\.\d{1,2})?$";
于 2013-05-29T12:53:32.217 回答