2013-03-17 70 views
1

我想在我的一個項目中使用boost正則表達式。 其實我將我的一個軟件移植到C++,它非常依賴正則表達式。Boost :: regex奇怪的行爲

我看到一些與我以前使用其他Regex庫有關的經驗。 我希望有人可以幫助我理解或讓我知道是否有額外的標誌,我可以使用提升來實現我的要求。

這裏是主題字符串:

This is an example to test regex `54 6767 98` thats it 

當我使用這個表達式:\\\d*,我希望得到54結果 (當我在Delphi中使用的.Net正則表達式或TperlRegex這恰好),但是當我使用boost,函數返回TRUE,但cmatch是空的!

這是正常的嗎?我知道我可以使用\d+。但這不是我需要它工作的關鍵,因爲它會成爲我在我的軟件中使用的更復雜的正則表達式中的許多其他問題的原因。

這裏是代碼的方式:

cmatch what; 
boost::regex re("\\d*", regex::perl | regex::icase); 
std::string ssub = "something 54 67 979 some text"; 
if (boost::regex_search(ssub.c_str(), what , re) 
    return what[0]; 

我想應該在這種情況下返回54,但事實並非如此。 正如我所料,它在/ Regex和TperlRegex中工作。

Regards

+0

'*'匹配0或更多。你要 '?'匹配1個或更多。 – stark 2013-03-17 11:34:28

+0

@stark:錯誤。 '?'匹配0或1.'+'匹配1或更多。但在這裏並不重要,因爲引擎應該是貪婪的並且吃掉可以通過'\ d *'匹配的最長的字符串。 – nhahtdh 2013-03-17 11:39:06

+0

對不起,意思是+。 ANyway,\ d *匹配字符串的開頭。 – stark 2013-03-17 11:49:07

回答

3

'*'匹配0或更多。你想'+'匹配1或更多。

問題是\ d *會匹配字符串中的任何位置。爲了保證它從一個數字開始,使用+。

+1

+1。 http://liveworkspace.org/code/3Kk24s$0。您也可以在調用'regex_search'時使用'match_not_null'標誌。 http://liveworkspace.org/code/3Kk24s$1。 – 2013-03-17 12:11:34

+0

非常感謝,但它只是一個簡單的例子來展示我的問題。我有許多複雜的正則表達式,因爲這個問題不起作用。在這個例子中使用+並不能解決我的問題。 – QProgrammer 2013-03-17 18:21:45

+0

llonesmiz,非常感謝!這就是訣竅!它符合我使用match_not_null標誌時的預期。 – QProgrammer 2013-03-17 18:23:25