84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
R"xxx()xxx": xxx可以被替换成任何字符串,不可以包含括号和双引号,而且你需要保证两边是一样的。如果你这样写,那么括号里面的任何字符都不会被转义,甚至是换行符也没有问题。这种字符串语法用来写正则表达式就特别的方便。
R"xxx()xxx"
可以详细说下用法吗, 感觉不是很理解.
走同样的路,发现不同的人生
不知道你是不懂R還是不懂xxx,那我就都說說吧
R
xxx
先說R,這是代表Raw String
Raw String
例如以下文字
abc efg\n
在沒有Raw String之前,你要這樣寫
"abc\n\tefg\n"
字串裡的特殊符號都要經過轉義
但是有了Raw String之後,你可以這樣寫
R"(abc efg\n)"
也就是Raw String括號裡面的文字是所見即所得的
可能你會奇怪,為什麼需要一對括號?
考慮一下文字
abc"efg
如果沒有括號,那就會寫成R"abc"efg",這樣就無法判斷哪個是配對的雙引號因此需要引入括號來定界了
R"abc"efg"
引入括號了以後,如果原始文本中有引號+括號呢? 如
abc)"efg
依照上面的寫法,就需要寫成R"(abc)"efg)",這顯然會導致語法錯誤,無法判斷哪個是配對的)"顯然,在文本包含有)"的情況下下,()不足以定界
R"(abc)"efg)"
)"
()
因此需要自訂delimiter(定界符),就是你題目中的xxx(...)xxx,上面的字串就可以寫成R"xxx(abc)"efg)xxx",這樣編譯器就可以分辨出包含在xxx(...)xxx裡面的都是原始文本,當然xxx可以任你自訂,你也可以寫成ab(...)ab
delimiter
xxx(...)xxx
R"xxx(abc)"efg)xxx"
ab(...)ab
這是C++11裡面的raw string literals
#include <iostream> int main() { std::cout << R"delimiter(\non\t-\t"escape")delimiter" << std::endl; return 0; }
輸出
\non\t-\t"escape"
也就是括號中間的不會被轉義,以原樣輸出。 因為正規表示式裡面""用得比較多,所以這種方式避免了""要轉換成"\"的問題。 例如:
"('(?:[^\']|\.)*'|"(?:[^\"]|\.)*")|"
如果不用這種方式,那就需要寫成這樣:
"('(?:[^\\']|\\.)*'|\"(?:[^\\\"]|\\.)*\")|"
自訂分割字串的用途:識別raw string在何處結束。
不知道你是不懂
R
還是不懂xxx
,那我就都說說吧先說
R
,這是代表Raw String
例如以下文字
在沒有
Raw String
之前,你要這樣寫字串裡的特殊符號都要經過轉義
但是有了
Raw String
之後,你可以這樣寫也就是
Raw String
括號裡面的文字是所見即所得的可能你會奇怪,為什麼需要一對括號?
考慮一下文字
如果沒有括號,那就會寫成
R"abc"efg"
,這樣就無法判斷哪個是配對的雙引號因此需要引入括號來定界了
引入括號了以後,如果原始文本中有引號+括號呢?
如
依照上面的寫法,就需要寫成
R"(abc)"efg)"
,這顯然會導致語法錯誤,無法判斷哪個是配對的)"
顯然,在文本包含有
)"
的情況下下,()
不足以定界因此需要自訂
delimiter
(定界符),就是你題目中的xxx(...)xxx
,上面的字串就可以寫成
R"xxx(abc)"efg)xxx"
,這樣編譯器就可以分辨出包含在
xxx(...)xxx
裡面的都是原始文本,當然
xxx
可以任你自訂,你也可以寫成ab(...)ab
這是C++11裡面的raw string literals
輸出
也就是括號中間的不會被轉義,以原樣輸出。
因為正規表示式裡面""用得比較多,所以這種方式避免了""要轉換成"\"的問題。
例如:
如果不用這種方式,那就需要寫成這樣:
自訂分割字串的用途:識別raw string在何處結束。