0

我有一个 javascript 正则表达式的问题。这是我的正则表达式:

(([\+\-\/\*\^]?)([(]*(([(]?((([+-]?\d+([.,]?(\d+)?)?)|(Q[0-9]+)?)([e][+-]\d+)?)[)]?)|([(]?value[)]?))[)]*)?(([(]*([(]?((([+-]?\d+([.,]?(\d+)?)?)|(Q[0-9]+)?)([e][+-]\d+)?)[)]?)|([(]?value[)]?)[)]*))?([\+\-\/\*\^])([(]*(([(]?((([+-]?\d+([.,]?(\d+)?)?)|(Q[0-9]+)?)([e][+-]\d+)?)[)]?)|([(]?value[)]?))[)]*))+

例如,这个正则表达式测试文本是否是数学公式(18*19)/2,我可以QXX像变量一样添加,例如: Q18/42+7*Q7

这个正则表达式在 java 中工作得很好(我已经在http://fiddle.re/dnbh6上测试过它)。但是,当我尝试在 javascript 中转换它时,它不起作用......这是我尝试过的所有解决方案:

var reg =/(([\+\-\/\*\^]?)([(]*(([(]?((([+-]?\d+([.,]?(\d+)?)?)|(Q[0-9]+)?)([e][+-]\d+)?)[)]?)|([(]?value[)]?))[)]*)?(([(]*([(]?((([+-]?\d+([.,]?(\d+)?)?)|(Q[0-9]+)?)([e][+-]\d+)?)[)]?)|([(]?value[)]?)[)]*))?([\+\-\/\*\^])([(]*(([(]?((([+-]?\d+([.,]?(\d+)?)?)|(Q[0-9]+)?)([e][+-]\d+)?)[)]?)|([(]?value[)]?))[)]*))+/g;
reg.test("Q18+aaaa)//return true, but in java this is resturn false

var reg= new RegExp("(([\+\-\/\*\^]?)([(]*(([(]?((([+-]?\d+([.,]?(\d+)?)?)|(Q[0-9]+)?)([e][+-]\d+)?)[)]?)|([(]?value[)]?))[)]*)?(([(]*([(]?((([+-]?\d+([.,]?(\d+)?)?)|(Q[0-9]+)?)([e][+-]\d+)?)[)]?)|([(]?value[)]?)[)]*))?([\+\-\/\*\^])([(]*(([(]?((([+-]?\d+([.,]?(\d+)?)?)|(Q[0-9]+)?)([e][+-]\d+)?)[)]?)|([(]?value[)]?))[)]*))+", "g");
reg.test("Q18+aaaa)//return true, but in java this is resturn false

所以,如果你有任何想法,我会试试的。

4

2 回答 2

0

我不确定您在这里所做的是否正确,但我想我知道您的问题是什么。

在 Java 中,如果您使用该matches()方法,它会将正则表达式与完整的字符串进行匹配。

Javascript 没有这样做,它还返回部分匹配项。要实现相同的行为,您必须在正则表达式周围添加锚点。^匹配字符串的开头并$匹配字符串的结尾。

所以它应该看起来像这样(缩短了巨大的正则表达式!):

var reg= new RegExp("^(([\+\-\/\*\^]?)...([(]?value[)]?))[)]*))+$", "g");
  Added anchors ==>  ^                                          ^
于 2013-04-29T13:19:20.870 回答
0

根据您在此正则表达式上的括号数量,我假设您不想捕获任何数据。一个更好的正则表达式来验证输入可能看起来像:

/
   [(](?R)[)] # match parenthesis
   |(?R)[-+/*^](?R) # allow to use one operator over to operands
   # a number, can be separated by "," or "." and can be followed by a exponent,
   # do _not_ accept decimal mark
   |[+-]?\d+([,.]\d+)?(e[+-]\d+)?
   |Q[0-9]+(e[+-]\d+)?
   |value
/x

由于递归,您不能使用锚点,此外,我使用了 PCRE,(?R)您将需要某种库支持来进行递归,如评论中所述。

编辑:如果要保存数据,可以编写解析函数,其大纲如下:

function parse(input) {
    var output = [],
        brackets = 0,
        op = null,
        qvariable = false,
        buff = [],
        stringbuff = '',
        sign = null;

    for (i = 0; i < input.length; i++) {
        var currentChar = input.charAt(i);

        if (sign && /[0-9]/.test(currentChar)) {
            return 'erro, expecting number';
        }

        if (op != null && /[-+/*(]/.test(currentChar)) {
            op = null;
        }

        switch (currentChar) {
            case '(':
                buff.push(output);
                output = [];
                break;

            case ')':
                if (op != null) { return 'operator before parenthesis close'; }
                output.push(stringbuff);
                parenthesis = output
                output = buff.pop();
                output.push(parenthesis);

                stringbuff = '';
                break;

            case '-':
            case '+':
            case '/':
            case '*':
                if (op == null) {
                    op = currentChar;
                } else {
                    if (currentChar == '-' && currentChar == '+') {
                        sign = currentChar;
                    } else {
                        return 'error, two operators in sequence';
                    }
                }
                output.push(stringbuff);
                output.push(op);
                stringbuff = '';
                break;

            case 'Q':
                if (!stringbuff.length) { return null; }
                qvariable = true;
                stringbuff += currentChar;

            // todo: handle comma, dot and exponents
            default:
                if (/[0-9]/.test(currentChar)) {
                    if (sign) { 
                        stringbuff += sign;
                        sign = null;
                    }
                    stringbuff += currentChar;
                } else {
                    return 'unexpected input';
                }
                break;
        }
    }
    if (stringbuff.length) {
        output.push(stringbuff);
    }
    return output;
}
于 2013-04-29T14:17:22.060 回答