2014-10-29 97 views
1

我正在爲了速度和內存管理的原因將PHP程序轉換爲C++。因爲PHP uses Perl-Compatible syntax,我去了增強庫是also uses the Perl syntaxBoost正則表達式不會編譯

使用Visual Studio Express 2013,我能夠使用我的7個表達式中的6個。在一個給我適合低於

^([\w]+= {\s*(?:[a-f0-9]{2}\s+)*})\s* 

用於代碼如下:

MASKSUBSYS= { 00 af 01 02 } 

我得到以下運行:

#include <string> 
#include <boost/regex.hpp> 
std::string regexError = R"~(^([\w]+= {\s*(?:[a-f0-9]{2}\s+)*})\s*)~"; 
boost::regex e(regexError); 

這種表達這樣一個Regex101 Example字符串匹配致電時請特別注意boost::regex e(regexError);

RegexTest.exe中的0x7515C41F處未處理的異常:Microsoft C++異常:內存位置0x002DED5C處的boost :: exception_detail :: clone_impl>。

它看起來像是沒有問題,因爲你可以看到從原始字符串讀取到內存中的黑色斜線轉義。

String in memory

就像我說的,只有7個表達式1不會直接編譯出來的PHP。我猜這與正則表達式的基本原理有關,但我對正則表達式不夠熟悉。這甚至不是迄今爲止最複雜的表達!有任何想法嗎?

+1

我不知道,如果'[\ w] +'真的是你需要什麼'[]'應該是一組字符。我會在那裏簡單地使用'\ w +'。另外我認爲你需要逃避你的''和'}'。類似於:'R'〜(^(\ w + = \ {\ s *(?:[a-f0-9] {2} \ s +)* \})\ s *)〜「' – Galik 2014-10-29 13:51:09

+0

你是對的。你應該回答這個問題! – Kenneth 2014-10-29 16:13:38

回答

1

最可能的問題是大括號{ }元字符也需要被轉義。而不是在\w周圍放置一個角色班級,你可以按如下方式自行寫出。

R"~(^(\w+= \{\s*(?:[a-f0-9]{2}\s+)*\})\s*)~" 

Code Demo

+0

Duh!...我從未見過stacked-crooked.com。謝謝! – Kenneth 2014-10-29 16:12:50