我有以下正则表达式匹配小数:
@"[\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"/>
我在这里使用了错误的活动吗?
谢谢你。
答案 0 :(得分:4)
答案 1 :(得分:3)
问题是你的正则表达式将匹配最后两个数字(如果它们存在),因此将字符串视为匹配。你需要锚点来告诉正则表达式,这个数字应该以最后的数字结尾。
^\d{1,4}([.]\d{1,2})$
您不需要在\d
周围放置方括号,您可以使用\.
来转义点,如下所示:
^\d{1,4}(\.\d{1,2})$
答案 2 :(得分:1)
你需要做一些事情。首先,您希望以^开头并以$结尾,以确保您没有任何不需要的开头或结尾字符。接下来,你将不得不逃避。使它成为文字。正如您已经注意到的那样,您会想要吗?在分组之后,#。部分不是必需的,但是允许的。
这使你的最终正则表达式如下:
@"^\d{1,4}(\.\d{1,2})?$";