【问题标题】:Why do I get an unexpected result from my regular expression? [duplicate]为什么我的正则表达式会得到意外结果? [复制]
【发布时间】:2020-02-11 12:45:20
【问题描述】:

我目前正在测试一个项目的输入验证,并且我正在使用正则表达式。

在尝试解析之前,我试图查看 TextBox 的内容是否为十进制数。

为此,我使用表达式\d+([\.\,]{1}\d+)?

我希望它检查是否有一个或多个数字,然后是零或一个点或逗号与一个或多个数字的组合。

有效的输入是:

123

12.3

1,23

无效的输入是:

12.

.123

1...2

1.2.3.3

在使用不同的已知错误输入对其进行测试后,该表达式似乎无法正常工作。我错过了什么吗?

我使用的代码是:

private bool validateFloatNumber(string Text, TextBox Box)
        {
            Regex regex = new Regex("\\d+([\\.\\,]{1}\\d+)?");
            bool result = regex.IsMatch(Text);
            if (!result)
            {
                if (Text.Length == 0)
                {
                    Box.Background = Brushes.Gray;
                }
                else
                {
                    Box.Background = Brushes.Red;
                }
            }
            else
            {
                Box.Background = Brushes.Transparent;
            }
            return result;
        }

我用输入1...1对其进行了测试,results中写入的值是true

Here is an image of the debug and the wrong value given in result

提前致谢!

【问题讨论】:

  • TextBox 验证调用什么事件?
  • 为您的样本尝试一个正则表达式测试器,例如regexstorm.net/tester
  • 单个数字有效吗?
  • @Rob 我按下按钮时调用它,这不是事件处理程序
  • @Yaman 我已经在 regex101 尝试过,它产生了正确的结果

标签: c# regex wpf


【解决方案1】:

绝不是RegEx 专家,但也许:

^(\d|\d+[.,]?\d+)$

这将测试以下任一情况:

  • \d - 一位数
  • \d+ - 一位或多位数字,[.,]? 零或一个点或逗号后跟 \d+ 至少多一位数字。

Online Test

【讨论】:

    【解决方案2】:

    我认为您的问题可能是regex.IsMatch(Text) 在字符串中存在匹配anywhere 时返回true。有关如何匹配整个字符串的说明,请参阅 this post

    【讨论】:

      【解决方案3】:
          private static bool validateFloatNumber(string Text, TextBox Box)
          {
              Regex regex = new Regex("^[0-9]{1,9}([,.][0-9]{1,4})?$");
              bool result = regex.IsMatch(Text);
              if (!result)
              {
                  if (Text.Length == 0)
                  {
                      Box.Background = Brushes.Gray;
                  }
                  else
                  {
                      Box.Background = Brushes.Red;
                  }
              }
              else
              {
                  Box.Background = Brushes.Transparent;
              }
              return result;
          }
      

      ^ Beginning 匹配字符串的开头,如果启用了多行标志 (m),则匹配行的开头

      [ 字符集。匹配集中的任何字符。

      0-9 范围。匹配“0”到“9”范围内的字符(字符代码 48 到 57)。区分大小写。

      ]

      {1,9} 量词。匹配前一个标记的 1 到 9 个。

      (

      捕获组 #1。将多个标记组合在一起并创建一个捕获组,用于提取子字符串或使用反向引用。

      [ 字符集。匹配集中的任何字符。

      , 字符。匹配“,”字符(字符代码 44)。

      . 字符。匹配“.”字符(字符代码 46)。

      ]

      [ 字符集。匹配集中的任何字符。

      0-9 范围。匹配范围内的字符。 “0”到“9”(字符代码 48 到 57)。区分大小写。

      ]

      {1-4} 量词。匹配前一个标记的 1 到 4 个。

      )

      ?量词。 匹配前面标记的 0 和 1。

      $ End. 匹配字符串的结尾,如果启用了多行标志 (m),则匹配行的结尾。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-10
        • 1970-01-01
        • 1970-01-01
        • 2021-07-03
        • 1970-01-01
        • 1970-01-01
        • 2015-08-22
        • 2015-07-21
        相关资源
        最近更新 更多