2017-06-19 83 views
2

所以我應該接受用戶輸入並評估用戶輸入是否是有效的中綴表達式。我只接受+ -/* ()和數字。 所以最簡單的方法是使用正則表達式。正則表達式,當我不認爲它應該在C++

這是我的正則表達式:[\(\)\d\+\-\/\*]+。 我也試過:[\(\)0-9\+\-\/\*]+以及 [\(\)[:digit:]\+\-\/\*]+

我還沒有轉義字符嘗試,但我仍然得到同樣的結果。

問題是,當我把=作爲表達式,它通過。下面

代碼:

cout<<"Enter the infix expression: "; 
cin>>userInput; 
regex infix ("[\(\)\d\+\-\/\*]+"); 
while(cin.fail()||regex_match(userInput,infix)){ 
    cin.clear(); 
    cin.ignore(256, '\n'); 
    cout<<"Error: Not a valid infix expression!\n"; 
    cout<<"Enter the infix expression: "; 
    cin>>userInput; 
} 
cout<<"Valid expression!\n"; 

電流輸出:

Enter the infix expression: = 
Valid expression! 

預期輸出:

Enter the infix expression: = 
Error: Not a valid infix expression! 

請讓我知道如果你需要更多的代碼。

+0

我從來沒有做過在C++中,但在其他的語言,你不需要在使用逃脫大多數字符的正則表達式方括號,但' - '需要放在最後。我會嘗試'「[()+/* \ d - ]」' – TallChuck

+1

我認爲反斜槓字符本身必須逃脫,不是嗎? '「[()+/* \\ d - ]」' –

+0

你意識到Regex永遠不會驗證中綴表達式嗎? – NetMage

回答

1

固定的正則表達式的聲明看起來像

regex infix(R"([()\d+/*-]+)"); 

,或者,如果您不能使用原始字符串字面量:

regex infix("[()\\d+/*-]+"); 

C++ demo

注意,在+/之間的連字號,也不管逸出的,創建這些2個符號之間的範圍。另外,\d必須看起來像\\d在一個常規字符串文字和\d在原始字符串文字。

/符號不必轉義。

此外,邏輯必須進行調整,以返回相應的錯誤消息/行爲:

#include <iostream> 
#include <string> 
#include <regex> 
using namespace std; 

int main() { 
    string userInput = "="; 
    regex infix(R"([()\d+/*-]+)"); 
    if(regex_match(userInput,infix)){ 
     cout<<"Valid expression!\n"; 
    } else { 
     cout<<"Error: Not a valid infix expression!\n"; 
    } 
    return 0; 
} 
// => Error: Not a valid infix expression! 
+0

ahhh,我明白了。 –

+0

嗯,我也認爲代碼邏輯有問題。 –

+0

是的,我不得不調整條件。謝謝。 –

相關問題