正则表达式无法区分float和int类型

时间:2009-06-17 15:43:25

标签: c# .net regex

我已经编写了用于识别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");
    }
}

错误在哪里?

5 个答案:

答案 0 :(得分:11)

首先,我不认为正则表达式确实是这项工作的最佳工具。我只想使用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(即使它看起来像整数也应被识别为Double)

使用库而不是手动滚动正则表达式,所有这些(边缘情况除外)都会立即被覆盖。

答案 1 :(得分:1)

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

(*)取决于你要做的事情,确切地说:将 start 的字符串与整数或浮点数的表示形式匹配,或者只匹配完全的字符串由这样的表示组成?

答案 2 :(得分:1)

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

你只匹配第一个数字......

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

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