Regex не может различить типы float и int - PullRequest
2 голосов
/ 17 июня 2009

Я написал регулярные выражения для распознавания 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 ]

11 голосов
/ 17 июня 2009

Во-первых, я не думаю, что регулярные выражения действительно лучший инструмент для этой работы. Я бы просто использовал функции Double.TryParse() и Int32.TryParse().

Во-вторых, вам не хватает всего лота тестовых случаев с вашими регулярными выражениями:

  • Integer
    • 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, даже если он выглядит как Integer)

Все это (кроме, может быть, крайнего случая) будет немедленно покрыто с помощью библиотеки вместо ручного преобразования регулярного выражения.

1 голос
/ 17 июня 2009

Я не знаю, насколько регулярные выражения в C # совместимы с Perl, но я стараюсь не изобретать колесо, если оно не нужно изобретать:

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

Теперь я не понимаю, почему они не использовали [0-9], но это хорошо работает.

1 голос
/ 17 июня 2009

регулярное выражение "ent" должно быть привязано: Regex ent = new Regex("^[0-9]+$");

Вы соответствовали только первым числам ...

1 голос
/ 17 июня 2009

Вы пробуете свои тесты в неправильном порядке - переключите их или (*) поставьте $ в конце ваших шаблонов RE, чтобы убедиться, что они совпадают до конца.

(*) зависит от того, что вы пытаетесь сделать, а именно: сопоставить строки, которые начинаются с , с представлением целого числа или числа с плавающей запятой или только строк, которые полностью составлено из такого представления?

0 голосов
/ 17 июня 2009

регулярное выражение должно соответствовать всей строке. "^\d*\.\d*$" будет соответствовать. Кроме того, вы можете просто найти точку в строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...