Я написал регулярные выражения для распознавания 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");
}
}
Где ошибка?
Во-первых, я не думаю, что регулярные выражения - действительно лучший инструмент для этой работы. Я просто использовал функции Double.TryParse()
и Int32.TryParse()
.
Во-вторых, вам не хватает всего тестовых примеров с вашими регулярными выражениями:
Все эти (за исключением, возможно, края) будут немедленно покрыты использованием библиотеки вместо ручной перемотки регулярного выражения.
Я не знаю, насколько совместимы регулярные выражения С# с Perl, но я стараюсь не изобретать колесо, если это не требует повторного использования:
% perl -e 'use Regexp::Common; print $RE{num}{real}, "\n"'
(?:(?i)(?:[+-]?)(?:(?=[0123456789]|[.])(?:[0123456789]*)(?:(?:[.])(?:[0123456789]{0,}))?)(?:(?:[E])(?:(?:[+-]?)(?:[0123456789]+))|))
Теперь я не понимаю, почему они не использовали [0-9], но это хорошо работает.
должно быть привязано регулярное выражение "ent": Regex ent = new Regex ( "^ [0-9] + $" );
Вы сопоставляли только первые числа...
Вы пытаетесь выполнить свои тесты в неправильном порядке - переключите их или (*) положите $в конце ваших шаблонов RE, чтобы убедиться, что они полностью совпадают.
(*) зависит от того, что вы пытаетесь сделать, точно: соответствуют строкам, которые начинаются с представления целого числа или float или только строки, которые полностью состоят из такого представления?
регулярное выражение должно соответствовать всей строке. "^\d*\.\d*$"
будет соответствовать. Кроме того, вы можете просто искать период в строке.