我已经编写了用于识别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 :(得分:11)
首先,我不认为正则表达式确实是这项工作的最佳工具。我只想使用Double.TryParse()
和Int32.TryParse()
函数。
其次,您使用正则表达式错过了整批的测试用例:
使用库而不是手动滚动正则表达式,所有这些(边缘情况除外)都会立即被覆盖。
答案 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*$"
会匹配。或者,您只需在字符串中搜索句点。