正则表达式单独工作,但与|结合使用时不起作用

时间:2017-05-05 07:10:44

标签: javascript regex

我试图写一些像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。]

的第一部分

我在这里想念什么?感谢。

1 个答案:

答案 0 :(得分:1)

两件事:

  1. |周围有空格。那些空间很重要。
  2. 您可能需要对各个部分进行分组,以确保交替正确应用(可能与非捕获组:(?:...))。
  3. 例如:

    if (expression.match(/(?:[^+\-*/\d.])|(?:[+-](?=[*/]))|(?:[+\-*/]($|[^+\-.\d]))|(?:(^|[^+\-.\d])[*/])/))
    // -------------------^^^-----------^^^--------------^^^----------------------^^^-------------------^
        throw errors.ExpressionParserError;
    

    附注:要测试匹配项,请使用rex.test(str)而不是str.match(rex)。如果您的唯一目标是测试匹配,则无需构建结果数组。