-2

我正在尝试编写一个正则表达式来接受长度不超过 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 个数字。

例如;有效值 - 14.23、12345678901234.23 无效值 - 1.2344、12345678901234.3455

请帮我处理正则表达式??

4

2 回答 2

1

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

那么这只是构建正则表达式的一个案例,我正在测试12345678901234.00

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

添加 a+one 或 more的缩写,因此\d+匹配两次12345678901234并且00

如果你限制在只有两位数字的范围内,\d{2}那么你会得到 8 对数字

要添加 a.您需要将字符转义.为匹配任何数字的模式,因此改为\.\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
于 2013-08-21T11:27:16.873 回答
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

更新:

由于目标是用户不能在文本框中写入满足正则表达式的内容之外的任何内容,您可以在文本更改事件中执行此操作(按键不是一个好的选择,因为您必须处理将 KeyEventArg 的键转换为字符)。因此,实现您所需要的最简单的方法是:

  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。”

于 2013-08-21T11:14:41.067 回答