如何为Regex.ismatch函数提供正则表达式?

时间:2013-08-21 10:58:52

标签: c# regex

我正在尝试编写一个正则表达式来接受长度为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个条件限制值

  1. 它应该只接受数字和长度不应该增加14到小数点。
  2. 如果之后只有小数点,则只允许2个数字。
  3. 例如;有效值 - 14.23,12345678901234.23       无效值 - 1.2344,12345678901234.3455

    请帮我正则表达式?

2 个答案:

答案 0 :(得分:1)

构建正则表达式的最佳方法是使用Regex Tester。你可以下载一个名为Cappucino的非常好的,或者你可以使用网络,我赞成http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx

然后它只是构建正则表达式的一个案例,我正在测试12345678901234.00

如果你从\d开始,这是一个数字数字的正则表达式模式,那么你将得到你期望的所有十六个匹配。

添加+ 一个或多个的缩写,因此\d+匹配两次1234567890123400

如果你只限制两个数字的范围,即\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。”