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在何处结束。