var chars = expr.ToCharArray();
var opers = new char[] { '+', '-', '/', '*' };
bool isOp = false;
for (var i = 0; i < chars.Length; i++)
{
char c = chars[i];
if (opers.Contains(c))
{
if (isOp || i == 0)
throw new ArgumentException("operator leads or follows operator @ " + (i + 1));
isOp = true;
}
else if (!char.IsNumber(c))
throw new ArgumentException("found NaN @ " + (i + 1));
else
isOp = false;
}
if (isOp)
throw new ArgumentException("ends with operator");
3条答案
按热度按时间7uhlpewt1#
这个正则表达式看起来像你想要的:
它将允许数字和数学运算符
-
,+
,/
,*
,^
的任何组合。它并不完美,因为它将允许输入只是操作符,或者在一行中有多个操作符等。虽然可以编写一个只匹配有效表达式的正则表达式,但在实际计算表达式的解析器中执行此操作可能会更好。使用regexp只是为了简单的预验证。
vfh0ocws2#
下面的正则表达式:
将匹配以数字序列结束的行,该数字序列前面有零个或多个带有运算符的数字序列。Is具有可选的+/-前缀。
它将匹配:
但不会匹配:
通过进一步调整,您甚至可以提取数字和运算符,这样就不必再次解析表达式。
pod7payv3#
您可以只步行并手动检查,例如