2014-07-13 4 views
0

를 토큰 화 I 형식 문자열 토큰 화 다음 코드가 (1 + 2)/((8)) - (100 * 34)C++ 11 정규식 수식

I가 좋겠을 그들이 정규 표현식의 일부가 아닌 연산자 나 문자를 사용하면 오류가 발생합니다. 예 : 사용자가 3^4 또는 x-6을 입력하는 경우

정규식을 무효화 할 수있는 방법이 있습니까? 해당 항목을 검색하면 오류가 발생합니까?

정규 표현식을 개선 할 수 있습니까?

//Using c++11 regex to tokenize input string 
    //[0-9]+ = 1 or many digits 
    //Or [\\-\\+\\\\\(\\)\\/\\*] = "-" or "+" or "/" or "*" or "(" or ")" 
    std::regex e ("[0-9]+|[\\-\\+\\\\\(\\)\\/\\*]"); 
    std::sregex_iterator rend; 
    std::sregex_iterator a(infixExpression.begin(), infixExpression.end(), e); 

    queue<string> infixQueue; 
    while (a!=rend) { 
     infixQueue.push(a->str()); 
     ++a; 
    } 
    return infixQueue; 

고마워요

당신은 숫자가 아닌 모든 문자, 라운드 브라켓, + 또는 -를 발견 "[^0-9()+\\-*/]"로 C++ 문자열로 정의 검색 식 [^0-9()+\-*/]를 사용하여 문자열에서 검색을 실행할 수 있습니다
+3

정규 표현식은 중첩 된 괄호처럼 중첩 된 구조에서는 좋지 않습니다. –

+1

@JoachimPileborg 사실, 중첩과 관련이 없기 때문에 * 토큰 화 *는 훌륭합니다. – delnan

+0

토큰 화가 작동하지만, 처리 할 수없는 연산자가 포함 된 토큰 화가 필요하지 않았습니다. 사용자가 3 + 5^6 => '3'+ ''5 ''6 '을 입력했기 때문입니다. –

답변

1

기호 (진짜 하이픈), 별표 또는 슬래시.

이 정규 표현식 검색 문자열을 사용하는 검색은 ^ 또는 x과 같이 지원되지 않는 문자가 포함 된 문자열을 반환하지 않습니다.

[ ... ]은 대괄호 안에있는 문자 중 하나를 찾는 긍정적 인 문자 클래스입니다.

[^ ... ]은 대괄호 안에있는 문자가 아닌 문자를 찾는 음수 문자 클래스입니다.

리터럴 문자로 해석 될 대괄호 안에 탈출해야하는 문자는 -가 대괄호 내에있는 문자 목록에서 첫 번째 또는 마지막 문자 인 경우 이스케이프는 안된다 ], \- 있습니다. 그럼에도 불구하고 대괄호 안에 항상 -을 이스케이프하는 것이 더 좋습니다. 이렇게하면 정규 표현식 엔진/함수가 하이픈 문자를 "FROM x에서 z"가 아닌 리터럴 문자로 해석해야한다는 것을 쉽게 감지 할 수 있습니다.

물론이 표현식은 닫는 대괄호가 있는지 확인하지 않습니다. 그러나 수식 파서는 종종 컴파일러 나 스크립트 인터프리터와 비교하여 모든 여는 괄호에 항상 닫는 괄호가 있어야 할 필요가 없기 때문에 입력 된 수식을 기반으로 값을 계산할 필요가 없기 때문입니다.

+0

감사합니다. 내 잘못은 처음에는 [0-9] + 을 사용하여 정규식을 무효화하려했지만 유효성을 검사 할 때 [0-9]를 확인하는 것이 좋습니다. –