本文根據(jù)眾多互聯(lián)網(wǎng)博客內(nèi)容整理后形成姚炕,引用內(nèi)容的版權(quán)歸原始作者所有,僅限于學習研究使用亚皂,不得用于任何商業(yè)用途俱箱。
原生字符串標識
比如,你用標準regex庫來寫一個正則表達式灭必,但正則表達式中的反斜杠’\’其實卻是一個“轉(zhuǎn)義(escape)”操作符(用于特殊字符)狞谱,這相當令人討厭〗欤考慮如何去寫“由反斜杠隔開的兩個詞語”這樣一個模式(\w\w):
string s = "\\w\\\\\\w"; // 希望它是對的(譯注:不直觀跟衅、不美觀,且容易出錯)
請注意播歼,在正則表達式和普通C++字符串中伶跷,各自都需要使用連續(xù)兩個反斜杠來表示反斜杠本身。然而秘狞,假如使用C++11的原生字符串叭莫,反斜杠本身僅需一個反斜杠就可以表示。因而烁试,上述的例子簡化為:
string s = R"(\w\\\w)"; // 這次百分百正確
引發(fā)原生字符串標識提議的是這樣一個“驚天地泣鬼神”的例子:
"('(?:[^\\\\']|\\\\.)*'|\"(?:[^\\\\\"]|\\\\.)*\")|" // 這五個反斜杠是否正確?
// 即使是專家雇初,也很容易被這么多反斜杠搞得暈頭轉(zhuǎn)向
R”(…)”記法相比于”…”會有一點點的冗長,但為了不必使用煩瑣的“轉(zhuǎn)義(escape)”符號廓潜,“多一點”是必要的抵皱。
那么善榛,如何將雙引號‘”‘本身放到原生字符串里呢?只要它不是正好跟在右括弧’)’之后呻畸,那么非常簡單:
R"("quoted string")" // 這個字符串是 “quoted string”
但是移盆,假如我們偏要在原生字符串中表達右括弧后跟雙引號 )” 這樣一個奇葩組合呢?首先伤为,幸運地是咒循,這種情況一般很少碰到;其次绞愚,”(…)”分隔法只不過是默認的分隔語法罷了叙甸。通過在“(…)”的(…)前后添加顯式的自定義分隔號(譯注:例如下面例子中的三個星號*),我們還可以創(chuàng)造出任何我們想要的分隔語法位衩。
// 字符串為:"quoted string containing the usual terminator (")"
R"***("quoted string containing the usual terminator (")")***"
在右括弧之后的字符序列(即:自定義分隔號)必須與左括弧之前的字符序列相同裆蒸。通過這種方式,我們幾乎可以處理任意復雜的模式糖驴。
參考資料