书籍:《ISO/IEC 14882 2014》
说明:以上内容大部分来自腾讯元宝
如何理解以下内容:
3 [
Note:
The characters
’(’
and
’)’
are permitted in a
raw-string
. Thus,
R"delimiter((a|b))delimiter"
is equivalent to
"(a|b)"
.
— end note
]
在C++中,原始字符串字面量(Raw String Literal)允许直接包含字符 (
和 )
,只要它们不出现在分隔符(delimiter
)序列中。以下是具体解释和示例:
1. 语法规则
-
原始字符串格式:
R"delimiter(raw_characters)delimiter"
delimiter
是自定义的分隔符序列(由1-16个非括号、非反斜杠的字符组成)。raw_characters
是原始字符串内容,允许包含(
和)
,只要它们不在分隔符中。
-
关键点:
- 分隔符必须首尾一致,且不包含
)
。 - 字符串内容中的
(
和)
会被视为普通字符,无需转义。
- 分隔符必须首尾一致,且不包含
2. 示例解析
示例代码:
const char* str = R"delimiter((a|b))delimiter";
- 分隔符:
delimiter
- 内容:
(a|b)
- 等效性:该原始字符串等价于普通字符串
"(a|b)"
。
输出结果:
(a|b)
3. 设计意图
-
保留括号的原始含义:
在正则表达式、文件路径或数学表达式中,(
和)
是常用符号。原始字符串允许直接包含它们,无需转义。const char* regex = R"(\d{3}-\d{2}-\d{4})"; // 正则表达式中的括号无需转义
-
避免分隔符冲突:
若字符串内容需要包含)
,只需选择不包含)
的分隔符即可。const char* text = R"xyz(This contains ) and " characters)xyz"; // 分隔符为xyz,内容含)
4. 常见误区
误区1:分隔符包含 )
// 错误:分隔符包含),导致字符串提前结束
const char* invalid = R")delimiter((a|b))delimiter)";
// 编译错误:分隔符不匹配
误区2:混淆分隔符与内容
// 正确:分隔符为delimiter,内容含)
const char* valid = R"delimiter(This contains ) and " characters)delimiter";
5. 实际应用场景
场景 | 传统字符串写法 | 原始字符串写法 |
---|---|---|
正则表达式 | R"(\d{3}-\d{2}-\d{4})" | R"delimiter(\d{3}-\d{2}-\d{4})delimiter" |
文件路径 | R"(C:\Path\To\File)" | R"delimiter(C:\Path\To\File)delimiter" |
多行文本 | R"(\nLine1\nLine2)" | R"delimiter(\nLine1\nLine2)delimiter" |
6. 总结
- 允许字符:原始字符串中的
(
和)
是普通字符,无需转义。 - 分隔符选择:确保分隔符不包含
)
,以避免语法错误。 - 核心优势:简化包含特殊符号的字符串的书写,提升代码可读性。