我试图写一些像eval()的东西,这里有一些要求:
if the expression contains non-numeric character other than [+, -, *, /, .],
or [+, -] is followed by [*, /],
or [+, -, *, /] is not proceeded by a numeric e.g."10-",
or [*, /] is not preceded by a numeric e.g."-10" is valid, "*10" is not valid
throw an exception
我有以下代码:
if (expression.match(/[^+\-*/\d.]/) ||
expression.match(/[+-](?=[*/])/) ||
expression.match(/[+\-*/]($|[^+\-.\d])/) ||
expression.match(/(^|[^+\-.\d])[*/]/))
throw errors.ExpressionParserError;
当表达式如上所述分离时,它工作正常,但当我将它们与|(OR)组合时,它不再抛出异常
if (expression.match(/[^+\-*/\d.] | [+-](?=[*/]) | [+\-*/]($|[^+\-.\d]) | (^|[^+\-.\d])[*/]/))
throw errors.ExpressionParserError;
e.g。 " d * 1"应该落在表达式[^ + - * / \ d。]
的第一部分我在这里想念什么?感谢。
答案 0 :(得分:1)
两件事:
|
周围有空格。那些空间很重要。(?:...)
)。例如:
if (expression.match(/(?:[^+\-*/\d.])|(?:[+-](?=[*/]))|(?:[+\-*/]($|[^+\-.\d]))|(?:(^|[^+\-.\d])[*/])/))
// -------------------^^^-----------^^^--------------^^^----------------------^^^-------------------^
throw errors.ExpressionParserError;
附注:要测试匹配项,请使用rex.test(str)
而不是str.match(rex)
。如果您的唯一目标是测试匹配,则无需构建结果数组。