84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
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在何处结束。