我正在尝试编写一个正则表达式来接受长度为14的数字,如果它们保留小数点,则它应该只接受小数点后的2个数字。
我已通过以下链接尝试过: https://stackoverflow.com/a/9967694/861995
但是,相同的Regex.IsMatch函数不接受正常的正则表达式表达式,以^开头,以$结尾。
请帮助我,我是正则表达式的新手
private void ChangedSellUp_KeyDown(object sender, KeyEventArgs e)
{
string pattern = "^[0-9]*$";
Regex rx = new Regex(pattern);
if (rx.IsMatch(ChangedSellUp.Text))
{
e.Handled = true;
}
}
这里ChangedSellup.Text是我的文本框值,我试图根据2个条件限制值
例如;有效值 - 14.23,12345678901234.23 无效值 - 1.2344,12345678901234.3455
请帮我正则表达式?
答案 0 :(得分:1)
构建正则表达式的最佳方法是使用Regex Tester。你可以下载一个名为Cappucino的非常好的,或者你可以使用网络,我赞成http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx
然后它只是构建正则表达式的一个案例,我正在测试12345678901234.00
如果你从\d
开始,这是一个数字数字的正则表达式模式,那么你将得到你期望的所有十六个匹配。
添加+
一个或多个的缩写,因此\d+
匹配两次12345678901234
和00
如果你只限制两个数字的范围,即\d{2}
那么你得到8对数字
要添加.
,您需要转义该字符,因为.
是匹配任何数字的模式,因此请使用\.\d{2}
仅匹配.00
(这是您可选的部分号码)
如果您模式匹配1到14长\d{1,14}
之间的数字范围,那么您将匹配12345678901234
(这是主要数字)和00
所以现在你可以把它放在一起,我们通过说我们想要0或1次{0,1}
或者使用简写变体?
来使小数点后部分是可选的
\d{1,14}(\.\d{2})?
在这些
上正确匹配12345678901234.00
123456.00
1
1234
因为我不匹配该行的开头和结尾,所以也匹配这些
500.00USD
$1000
答案 1 :(得分:0)
这是Regex.IsMatch,可以满足您的需求:
Regex.IsMatch("12345678901234.12", @"^\d{1,14}(?:\.\d{1,2}){0,1}$")
特定的正则表达式是小数点前最多14位数和小数点后1位或2位数(整数小数部分是可选的)
测试它的好地方是:http://regexhero.net/tester/
因为你已经提到了^和$,我把它们包含在正则表达式中,它只用数字解析行(所以,例如“1234.12”在IsMatch中不会返回true,只需删除“^”和“$”如果不重要的话。)
正则表达式的另一个好资源是:http://www.mikesdotnetting.com/Article/46/CSharp-Regular-Expressions-Cheat-Sheet
<强>更新强>
由于目标是用户不能在文本框中编写除满足Regex之外的任何内容,您可以在文本更改事件中执行此操作(键入不是一个好选项,因为您必须处理转换KeyEventArg的char的关键)。因此,实现您所需要的最简单方法是:
private void TextBox1_TextChanged(object sender, TextChangedEventArgs e)
{
if (!Regex.IsMatch(TextBox1.Text, @"^\d{1,14}(?:\.\d{0,2}){0,1}$"))
{
TextBox1.Text = TextBox1.Text.Substring(0, TextBox1.Text.Length - e.Changes.Last().AddedLength);
TextBox1.CaretIndex = TextBox1.Text.Length;
}
}
请注意正则表达式中的小变化将接受一个数字后跟一个点,没有额外的数字,这是因为当你写一个带小数位的数字时,你将处于这种情况发生的状态,例如:“123。”