【问题标题】:Regex can't differentiate between float and int types正则表达式无法区分 float 和 int 类型
【发布时间】:2009-06-17 15:43:24
【问题描述】:

我已经编写了用于识别 float 和 int 的正则表达式,但它们似乎不起作用(代码如下)。

{
    string sumstring = "12.098";

    Regex flt = new Regex(@" ^[0-9]*(\.[0-9]*)");
    Regex ent = new Regex("^[0-9]+");

    if (d_type.IsMatch(sumstring))
    {
        Console.WriteLine(sumstring + " " + "dtype");
    }

    Match m = ent.Match(sumstring);

    if (m.Success)
    {
        Console.WriteLine("int");
    }
    else if (flt.IsMatch(sumstring))
    {
        Console.WriteLine("float");
    }
}

错在哪里?

【问题讨论】:

  • 为什么不只是“如果(m.Success)”?
  • 其实这只是骨架代码,我们尝试了很多东西 dts 为什么我使用了两个不同的匹配 fntns。

标签: c# .net regex


【解决方案1】:

首先,我不认为正则表达式真的是这项工作的最佳工具。我会简单地使用Double.TryParse()Int32.TryParse() 函数。

其次,您的正则表达式缺少一大堆测试用例:

  • 整数
    • 5(覆盖)
    • +5(未涵盖)
    • -5(未涵盖)
    • 5.0(已覆盖)
    • +5.0(未涵盖)
    • -5.0(未涵盖)
    • 5.0E5(未涵盖)
    • 5.0E+5(未涵盖)
    • 5.0E-5(未涵盖)
    • +5.0E5(未涵盖)
    • +5.0E+5(未涵盖)
    • +5.0E-5(未涵盖)
    • -5.0E5(未涵盖)
    • -5.0E+5(未涵盖)
    • -5.0E-5(未涵盖)
  • 边缘案例
    • 2^32 + 1(即使看起来像 Integer,也应该被识别为 Double)

所有这些(可能除了边缘情况)都将通过使用库而不是手动滚动正则表达式来立即覆盖。

【讨论】:

  • 我同意。不要重新发明轮子,RegEx 的性能会比使用 TryParse 慢得多
【解决方案2】:

您以错误的顺序尝试测试 - 切换它们,或 (*) 在 RE 模式的末尾添加一个 $,以确保它们一直匹配到最后。

(*) 完全取决于您要执行的操作:将 start 的字符串与整数或浮点数的表示匹配,或者仅匹配 完全 的字符串em> 由这样的表示组成?

【讨论】:

    【解决方案3】:

    我不知道 C# 的正则表达式与 Perl 的兼容性如何,但我尽量不要重新发明轮子,除非它需要重新发明:

    % perl -e 'use Regexp::Common; print $RE{num}{real}, "\n"'
    (?:(?i)(?:[+-]?)(?:(?=[0123456789]|[.])(?:[0123456789]*)(?:(?:[.])(?:[0123456789]{0,}))?)(?:(?:[E])(?:(?:[+-]?)(?:[0123456789]+))|))
    

    现在,我不明白他们为什么不使用 [0-9],但这很好用。

    【讨论】:

      【解决方案4】:

      “ent”正则表达式应锚定:Regex ent = new Regex("^[0-9]+$");

      您只匹配了第一个数字...

      【讨论】:

        【解决方案5】:

        正则表达式必须匹配整个字符串。 "^\d*\.\d*$" 将匹配。或者,您可以只在字符串中搜索句点。

        【讨论】:

          猜你喜欢
          • 2011-03-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-22
          • 1970-01-01
          • 2012-04-05
          • 1970-01-01
          相关资源
          最近更新 更多