2013-04-29 125 views
0

我有一个javascript的正则表达式的问题。 这是我的正则表达式:Java的正则表达式来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[)]?))[)]*))+ 

这正则表达式的测试,如果文本是例如matematical公式(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 

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

+0

http://regexpal.com/是一个很好的工具来测试正则表达式 – 2013-04-29 13:27:08

+0

保持记住'[(]?... []]?'不能保证所有的括号是成对的,你可以在不关闭的情况下打开,反之亦然,你需要一个PCRE的'(?R)问题](http://stackoverflow.com/questions/4414339/recursive-matching-with-regular-expressions-in-javascript) – 2013-04-29 13:42:07

+0

我希望你生成的正则表达式,而不是它是你的程序中的一个长字符串..我分析了一半并放弃了,但似乎你使用了太多的c适应团体。 – nhahtdh 2013-04-29 13:44:24

回答

0

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

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

JavaScript没有这样做,它也返回部分匹配。为了达到相同的行为,你必须在正则表达式中添加锚点。 ^匹配字符串的开始和$匹配字符串的末尾。

因此,它应该是这个样子(简称巨正则表达式!):

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

此解决方案与我的正则表达式完美配合!我只需要提供成对的括号。 – user2332144 2013-04-29 14:54:35

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; 
} 
+0

XRegExp支持递归匹配,但不像PCRE那样以'(?R)'的形式,但是你必须调用一个函数来完成它。 – nhahtdh 2013-04-29 14:42:07

+0

当我尝试你的解决方案时,调试模式发送给我:无法创建RegExp对象。 – user2332144 2013-04-29 14:51:13