2015-03-02 16 views
0

我正在使用boost/regex.hpp庫。正則表達式旨在匹配浮點數或任意數學運算符列表之一。尾部a是一個佔位符,因爲當前構造正則表達式的代碼在最後留下了|,我還沒有修復它。我的正則表達式是:正則表達式的幫助,匹配產生額外的空間

(?:([-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?)|(\s*sqrt\((.+?)\)\s*)|(\s*exp\((.+?)\)\s*)|(\^)|(\s*log2\((.+?)\)\s*)|(\s*log10\((.+?)\)\s*)|(\s*neg\((.+?)\)\s*)|(\s*floor\((.+?)\)\s*)|(\s*log\((.+?)\)\s*)|(\s*fact\((.+?)\)\s*)|(/)|([*])|([+])|([-])|a) 

和我的測試字符串是:

4.5 + 9.6e8 + sqrt(5) 

而最終匹配的是:

4.5           + 9.6e8           + sqrt(5) 5      

我不知道爲什麼會出現在捕捉之間的這麼多空間。

打印代碼

boost::regex reg(token); 
boost::smatch m; 
string s = input; 
while (boost::regex_search(s, m, reg)) { 
    for (int i = 1; i < m.size(); ++i) cout << m[i] << " "; 
    s = m.suffix().str(); 
} 
+2

你打印的比賽怎麼樣?問題似乎在代碼的這一部分。 – tripleee 2015-03-02 06:09:02

+0

@tripleee我添加了打印代碼。後來我打算用代碼替換'cout'以將標記添加到矢量中。 – 2015-03-02 09:37:39

回答

2

你有很多捕獲括號的,你要打印每個捕獲組之間的空間。許多捕獲組都是空的。也許你想重構你的正則表達式只捕獲你真正想要的東西。

+0

你是在說所有的|之間的捕獲充滿了空間?我認爲他們會被忽略,並在閱讀匹配對象時不可用。 – 2015-03-02 09:41:53

+0

不,我說你的代碼在每個這些空組之間打印'<<「」'。 – tripleee 2015-03-02 09:42:42

+0

對。我所以'smatch'對象的大小是基於'()'的數量,而不是它成功製作多少個捕獲。 – 2015-03-02 09:44:49

相關問題