Java正则表达式javascript正则表达式问题

时间:2013-04-29 13:13:08

标签: java javascript regex

我的javascript 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[)]?))[)]*))+

此regexp测试是否文本是一个例如的公式(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

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

2 个答案:

答案 0 :(得分:0)

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

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

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

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

var reg= new RegExp("^(([\+\-\/\*\^]?)...([(]?value[)]?))[)]*))+$", "g");
  Added anchors ==>  ^                                          ^

答案 1 :(得分: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;
}