2013-06-11 7 views
0

이 같은 토큰 식으로 나눌 수 있습니다 정규식이 필요정규식은

(, 6, <=, 5,), ||, (, 8, +, 1,), ^, 2, >=, 3, &&, 4, ==, 2 

내가이 일을했다지만

: 이것은 정규식

[(, 6, 5,), (, 8, +, 1,), ^, 2, 3, 4, 2] 

: 그것은 나에게이 결과를 제공 작동하지 않습니다 5,

[-]?[0-9]*+([eE][-]?[0-9]+)?|([+-/*///^])|([/(/)])|(>=)|(<=)|(&&)|(==)|(||) 

그것은 숫자와 연산 기호를 인식 않지만 조건에 대한 기호가 작동하지 않는 (& & ==, ||, < =,> =).

수정 방법을 알고 계십니까?

편집 :

편집

public void convertToList() { 
    String regex = "[-]?[0-9]+([eE][-]?[0-9]+)?|([-+/*\\\\^])|([()])|(>=)|(<=)|(&&)|(==)|([|][|])"; 
    Matcher m3 = Pattern.compile(regex).matcher(this.stringExp); 
    this.arrayExp = new ArrayList<String>(this.stringExp.length()); 
    while (m3.find()) { 
     this.arrayExp.add(m3.group()); 
    } 
} 

하지만 심지어 m.butter 의해 보정 된 정규식으로는 작동하지 않습니다 (위와 같은 결과) :이 코드입니다 정규식 작품을 제공, 나는 입력에 어리석은 실수를했다.

+1

사용중인 언어 또는 환경은 어느 언어입니까? –

+0

@ m.buettner : Java – AR89

+1

이 정보는 정규식 관련 질문에 항상 포함하십시오. –

답변

1

패턴에 몇 가지 문제가 있습니다.

  1. 대체로 |을 사용하고 있습니다. 결과적으로 |을 리터럴 파이프와도 일치시킬 수는 없습니다 (정규식 엔진이 어떻게 구별 할 수 있습니까?). 따라서 문자 그대로 일치하거나 문자 클래스에 넣어야하는 |을 탈출해야합니다.

  2. 탈출구가 잘못되었습니다.백 슬래시 \ 대신 슬래시 /을 사용해야합니다.

  3. 문자 클래스는 첫 번째 또는 마지막 문자로 입력하지 않는 한 범위를 나타냅니다. 문자 클래스 인 [+-...]에 문제가 있습니다. 하이픈을 이스케이프하거나 클래스의 첫 번째 또는 마지막 위치로 이동하십시오.

  4. 첫 번째 대체 번호 (숫자)는 모든 것이 선택이므로 빈 일치를 허용합니다. 그러면 원하지 않는 추가 빈 결과를 얻을 수 있습니다. 숫자 뒤에 *을 제거하십시오. 이 모든 적용

제공 : 당신이 , and이 ^`의 첫 번째 문자 inside a character class (unless the입니다 ^) (,을 탈출 할 필요가 없습니다

[-]?[0-9]+([eE][-]?[0-9]+)?|([-+/*\\^])|([()])|(>=)|(<=)|(&&)|(==)|([|][|]) 

주).

는 또한 그 모든 백 슬래시 두 배로 필요 자바 문자열로이 쓰기에 대한 정보 : 마지막으로

str = "[-]?[0-9]+([eE][-]?[0-9]+)?|([-+/*\\\\^])|([()])|(>=)|(<=)|(&&)|(==)|([|][|])" 

을, 당신은 당신이 모든 불필요한 괄호를 제거하는 경우이 꽤 많이 최적화하고 만들 수 있습니다 필요한 사람이 아닌 캡처 (나는 또한 문자 클래스를 합병 한) :

물론
str = "[-]?[0-9]+(?:[eE][-]?[0-9]+)?|[-+/*\\\\^()]|>=|<=|&&|==|[|][|]" 

, 당신이 가지 각각 일치했다 토큰 확인하려면 캡처를 사용하지 않으려면이에만 작동합니다.

Working demo

+0

나는 위의 코드에 정규 표현식을 복사하여 붙여 넣었지만 같은 결과를 얻었습니다. – AR89

+1

@ AR89 그것은 나를 위해 완벽하게 작동합니다 : http://ideone.com/dqQWPR ... 입력 문자열 또는 결과를 표시하는 방법과 함께 다른 문제가있을 수 있습니다. –

+0

이름과 함께 미스테를 만들었습니다 개체의, 그것은 작동합니다. – AR89

2

당신은 당신의 표현에 문제가 몇 가지있다 :

  • 당신은 문자 클래스 [+-/*///^]의 범위 연산자 -를 탈출하지 않았다, 그것은 [+\-/*^] 또는 [-+/*^] (첫번째 경우 탈출 할 필요 같이 쓸 수있다 /마지막).
  • 당신은
  • 숫자에 대한 귀하의 표현이 빈 문자열과 일치
  • , 당신이 원하지 않는 (\|\|) 있어야 (||)에서 | 탈출하지 않았다.

토큰 화의 팁 : 겹치면 가장 긴 토큰을 먼저 표현식에 넣으십시오. 즉 [<=] 앞에 <=을 입력하면 두 개가 아닌 하나의 토큰을 얻을 수 있습니다.

\d+|[<>=]=|&&|\|\||[-+*/^()] 

당신이 원하는 경우 번호를 뭔가 더 복잡한로 \d+를 교체합니다 (그러나 빈 문자열과 일치하지 않음) :

모두 모두 당신이 뭔가를 사용할 수 있습니다.