在下面的示例中,这两个字符)"
终止了原始字符串文字。
该序列)"
有时会出现在我的文本中,即使在其中找到该序列,我也希望该字符串继续。
R"(
Some Text)"
)"; // ^^
如何)"
在字符串文字中包含序列而不终止它?
在下面的示例中,这两个字符)"
终止了原始字符串文字。
该序列)"
有时会出现在我的文本中,即使在其中找到该序列,我也希望该字符串继续。
R"(
Some Text)"
)"; // ^^
如何)"
在字符串文字中包含序列而不终止它?
原始字符串文字允许您指定几乎任意的*分隔符:
//choose ### as the delimiter so only )###" ends the string
R"###(
Some Text)"
)###";
*确切的规则是:“基本源字符集的任何成员,除了:空格、左括号(、右括号)、反斜杠 \ 以及表示水平制表符、垂直制表符、换页符和换行符的控制字符” (N3936 §2.14.5 [lex.string] 语法)和“最多 16 个字符”(§2.14.5/2)
转义对你没有帮助,因为这是一个原始文字,但语法旨在通过引入一个像aha
.
R"aha(
Some Text)"
)aha";
顺便注意一下和最后的顺序)
,"
与你的例子相反。
关于形式,乍一看(研究标准)似乎转义在原始字符串文字中的作用与在普通文字中的作用相同。除了知道它没有,那么当规则中没有注明例外时,这怎么可能呢?好吧,当在 C++11 中引入原始字符串文字时,它是通过引入额外的撤消翻译阶段,撤消例如转义的效果!,也就是说,......
C++11 §2.5/3”在原始字符串的初始和最终双引号字符之间,在阶段 1 和 2 中执行的任何转换(三元组、通用字符名称和行拼接)都将被还原;在识别任何d-char、r-char或定界括号之前,此还原应适用。
这会处理 Unicode 字符规范(通用字符名称,如\u0042
),尽管它们看起来和行为都像转义符,但在 C++ 中,转义符在形式上不是转义序列。
真正的形式转义被处理,或者更确切地说,不被处理!,通过对原始字符串文字的内容使用自定义语法规则。即在 C++ §2.14.5 中,原始字符串语法实体定义为
"
d-char-sequence选择(
r-char-sequence选择)
d-char-sequence选择"
其中r-char-sequence被定义为 r-char 的序列,其中每个是
”源字符集的任何成员,除了右括号
)
后跟初始d-char-sequence [aha
如上](可能为空)后跟双引号"
从本质上讲,以上意味着您不仅不能直接在原始字符串中使用转义(这很重要,它是积极的,而不是消极的),您也不能直接使用 Unicode 字符规范。
以下是间接执行此操作的方法:
#include <iostream>
using namespace std;
auto main() -> int
{
cout << "Ordinary string with a '\u0042' character.\n";
cout << R"(Raw string without a '\u0042' character, and no \n either.)" "\n";
cout << R"(Raw string without a '\u0042' character, i.e. no ')" "\u0042" R"(' character.)" "\n";
}
输出:
带有“B”字符的普通字符串。 没有 '\u0042' 字符的原始字符串,也没有 \n。 没有'\u0042' 字符的原始字符串,即没有'B' 字符。
您可以使用,
R"aaa(
Some Text)"
)aaa";
这aaa
将是您的字符串分隔符。