2013-04-29 2 views
0

javascript regexp에 문제가 있습니다. 이 내 정규식 :Java regexp 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

이 정규 표현식 작업을 완벽에 자바 (나는 그것을 http://fiddle.re/dnbh6에서 테스트했습니다). 당신은 어떤 생각이 있다면

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/은 계속 –

+0

정규식 표현을 테스트 할 수있는 좋은 도구입니다 "((? ...))?"은 모든 괄호가 쌍을 이루고, 닫히지 않고 열 수 있다는 것을 보장하지는 않는다. PCRE의'(? R)'동등 물, [관련 SO 질문] (http://stackoverflow.com/questions/4414339/recursive-matching-with-regular-expressions-in-javascript) –

+0

난 당신이 프로그램에서 하나의 긴 문자열이 아닌 정규식을 생성 희망. 나는 그것을 절반으로 분석하고 포기하지만 너무 많은 c를 사용하고있는 것으로 보인다. apturing 그룹. – nhahtdh

답변

0

내가 여기서 뭘하고 있는지 확실하지 않지만, 나는 당신의 문제가 무엇인지 알고 있다고 생각합니다.

matches() 메서드를 사용하는 경우 Java에서 전체 문자열과 정규식을 비교합니다.

자바 스크립트가이를 수행하지 않고 부분 일치도 반환합니다. 동일한 동작을 얻으려면 정규식 주위에 앵커를 추가해야합니다. ^은 문자열의 시작과 일치하고 $은 문자열의 끝과 일치합니다. 그것은이 같은 (! 단축 거대한 정규식) 보일 것입니다 그래서

:

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

이 솔루션은 내 regexp와 완벽하게 작동합니다! 괄호를 쌍으로 제공하면됩니다. – user2332144

0

이 정규식에 미치는 괄호의 수에서를, 나는 당신이 어떤을 캡처하고 싶지 않아 있으리라 믿고있어 데이터. 당신은 또한, 앵커를 사용할 수 없습니다 재귀의, 내가 PCRE의 (?R)을 사용하기 때문에

/ 
    [(](?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 

당신이 재귀를 수행하는 라이브러리 지원의 어떤 종류가 필요합니다 말했듯 :처럼 그냥 입력을 검증하기 위해 더 나은 정규식 보일 수 있습니다 의견에.

편집 : 당신은 데이터를 저장하려면 당신은 구문 분석 기능, 다음 윤곽선 뭔가를 작성할 수 있습니다

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

+0

해결책을 시도 할 때 디버그 모드가 나를 보내고 RegExp 개체를 만들 수 없습니다. – user2332144