基础介绍
在c++11版本引入了一个特性(raw string literals)字符串字面量,这个特性的引入解决了在c++字符串中如果包含类似换行符、指标、单个反斜杠、转义字符等可以以人们更能理解的方式去使用,而传统的携带这些字符串的字符串需要将这些字符显式的写到字符串中。官方的解释可能更清楚:
来自转义序列的字符(制表符、换行符、单个反斜杠等)可以以原始形式输入,同时保持格式化。这在编写包含大量引号或特殊格式的文本时特别有用。这可以使你的字符串字面量更容易阅读和维护。
语法
R"delimiter(raw_characters)delimiter"
这里使用这个特性需要记住几点:
- 一定是R""的形式
- delimiter的中文意思是分隔符的意思,一般情况下分割符为空,仅使用()即可
- 中间部分raw_characters是具体的字符串
- 如果raw_characters中包含(或),那么就需要自己独立定义分隔符,注意分隔符不会加入的raw_characters中,仅仅是用于标识字符串的开头和结束。
请看下面的例子说明特殊分隔符
// 自定义分隔符
std::string custom = R"---(Hello "world" with (parentheses))---";//std::cout<<custom<<std::endl;//输出"Hello "world" with (parentheses)"
上面的例子中raw_characters中包含了(和),如果按照默认的分隔符无法分辨出字符串从哪里开始的,所以自定义分隔符---,通过这个分隔符可以知晓字符串从哪里开始的。
详细解释和实例
//传统的字符串写法
std::string Tranditional = "First line\nSecond line\tTabbed";//采用原始字符串字面量的写法
std::string raw = R("First line
Second line Tabbed");
通过上面的例子可以看到,采用新特性“原始字符串字面量”可以以原始形式输入,同时保持格式化,更方便人们阅读和理解程序的含义。
主要用途
- 文件路径:在传统方式中表示路径需要用到转换以字符\\,用于路径的反斜杠;采用新的方式则不需要使用转义字符串。
// 传统方式
std::string path1 = "C:\\Users\\Name\\Documents\\file.txt";// 原始字符串方式
std::string path2 = R"(C:\Users\Name\Documents\file.txt)";
- 多行文本
// 传统方式
std::string html1 = "<html>\n"" <body>\n"" <h1>Title</h1>\n"" </body>\n""</html>\n";// 原始字符串方式
std::string html2 = R"(
<html><body><h1>Title</h1></body>
</html>
)";
- 正则表达式:与文件路径一样,需要使用转义字符\
// 传统方式
std::string regex1 = "\\w+\\s*\\=\\s*\\d+";// 原始字符串方式
std::string regex2 = R"(\w+\s*\=\s*\d+)";
优点
- 可读性好
- 减少错误,可读性好的情况下对字符串处理当然会减少错误,否则字符串中携带一堆的转移字符,看上去眼花缭乱,密密麻麻的,当然更容易出错。
使用建议
推荐使用原始字符串字面量特性的的场景:
- 文本路径
- 多行文本
- HTML/XML
- JSON
- 正则表达式
- SQL查询