Regex не может различить типы float и int

2

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

Где ошибка?

  • 0
    Почему не просто «если (m.Success)»?
  • 0
    на самом деле это всего лишь скелетный код, мы пробовали много вещей, почему я использовал два разных совпадения fntns.
Теги:

5 ответов

11
Лучший ответ

Во-первых, я не думаю, что регулярные выражения - действительно лучший инструмент для этой работы. Я просто использовал функции 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)

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

  • 2
    Я согласен. Не изобретайте велосипед, и производительность вашего RegEx будет намного ниже, чем при использовании TryParse
  • 0
    спасибо за исправление меня.
1

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

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

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

1

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

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

1

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

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

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню