2011-02-24 112 views
1

我想寫一個函數來將德爾福/帕斯卡字符串文字轉換爲C等效。在Delphi中字符串文字的正則表達式("#"([0-9]{1,5}|"$"[0-9a-fA-F]{1,6})|"'"([^']|'')*"'")+匹配使帶子德爾福/帕斯卡爾字符串文字到C/C++

"This is a test with a tab\ta breakline\nand apostrophe '" 

將在帕斯卡寫成

'This is a test with a tab'#9'a breakline'#$A'and apostrophe ''' 

我設法剝離撇號,但我無法管理的特殊字符。

+1

你嘗試寫一個解析器? – 2011-02-24 20:00:10

+0

你到底是什麼?這是一個「C」程序嗎?一個「Delphi的例程呢?正則表達式? – 2011-02-24 20:02:38

+0

@ignacio它實際上是一個更大的解析器的一部分,我非常希望不必爲這些字符串編寫另一個。 @Cosmin我正在尋找一個C++功能是這樣的。 – Sambatyon 2011-02-24 20:17:51

回答

1

只需使用replaceApp()功能,可以發現:http://www.cppreference.com/wiki/string/basic_string/replace

然後代碼可以作爲看:

string s1 = "This is a test with a tab\\ta breakline\\nand apostrophe '"; 
string s2 = s1; 
s2 = replaceAll(s2, "'", "''"); 
s2 = replaceAll(s2, "\\t", "'$7'"); 
s2 = replaceAll(s2, "\\n", "'$10'"); 
cout << "'" << s2 << "'"; 

當然改變 '\ t' - > '$ 7' 可以保存在一些結構您可以在循環中使用,而不是用單獨的行替換每個項目。

編輯:

第二種解決方案(例如,從評論拍攝)使用map

typedef map <string, string> MapType; 
string s3 = "'This is a test with a tab'#9'a breakline'#$A'and apostrophe '''"; 
string s5 = s3; 
MapType replace_map; 
replace_map["'#9'"] = "\\t"; 
replace_map["'#$A'"] = "\\n"; 
replace_map["''"] = "'"; 
MapType::const_iterator end = replace_map.end(); 
for (MapType::const_iterator it = replace_map.begin(); it != end; ++it) 
    s5 = replaceAll(s5, it->first, it->second); 
cout << "s5 = '" << s5 << "'" << endl; 
+0

其實,我想要做的是相反的,在CI中有'''這是一個測試'#'''breakline'#$ A'和撇號'''「'我想獲得'」這是一個帶有tab \ ta breakline \ n和撇號的測試'「' – Sambatyon 2011-02-28 19:49:16