在原始字符串文字中包含 )" 而不终止所述文字
Posted
技术标签:
【中文标题】在原始字符串文字中包含 )" 而不终止所述文字【英文标题】:Include )" in raw string literal without terminating said literal 【发布时间】:2015-07-30 05:54:17 【问题描述】:两个字符 )"
在下面的示例中终止原始字符串文字。
序列)"
可能会出现在我的文本中,即使在其中找到该序列,我也希望字符串继续。
R"(
Some Text)"
)"; // ^^
如何在字符串文字中包含序列)"
而不终止它?
【问题讨论】:
【参考方案1】:Raw string literals 让您指定一个几乎任意的*分隔符:
//choose ### as the delimiter so only )###" ends the string
R"###(
Some Text)"
)###";
*确切的规则是:“基本源字符集的任何成员,除了: 空格,左括号(,右括号),反斜杠\, 和代表水平制表符的控制字符, 垂直制表符、换页和换行符”(N3936 §2.14.5 [lex.string] 语法)和“最多 16 个字符”(§2.14.5/2)
【讨论】:
【参考方案2】:转义对您没有帮助,因为这是一个原始文字,但语法旨在通过引入像 aha
这样的任意短语来明确划分开始和结束。
R"aha(
Some Text)"
)aha";
顺便注意最后)
和"
的顺序,与您的示例相反。
关于形式,乍一看(研究标准)似乎转义在原始字符串文字中的作用与在普通文字中的作用相同。除了知道它没有,那么当规则中没有注明例外时,这怎么可能呢?好吧,当在 C++11 中引入原始字符串文字时,它是通过引入额外的 undoing 翻译阶段来撤消例如的效果。逃跑!,也就是说,……
C++11 §2.5/3” 之间 原始字符串的初始和最终双引号字符,在阶段 1 中执行的任何转换 和 2 (trigraphs、universal-character-names, and line splicing) 被还原;应适用此恢复 在识别任何 d-char、r-char 或分隔括号之前。
这会处理 Unicode 字符规范(universal-character-names,例如 \u0042
),尽管它们看起来和行为都像转义符,但在 C++ 中,它们在形式上不是转义序列。 p>
真正的形式转义被处理,或者更确切地说,不被处理!,通过对原始字符串文字的内容使用自定义语法规则。即在 C++ §2.14.5 中,raw-string 语法实体被定义为
"
d-char-sequenceopt(
r-char-sequenceopt@ 987654328@ d-char-sequenceopt"
其中一个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' 字符。【讨论】:
【参考方案3】:你可以使用,
R"aaa(
Some Text)"
)aaa";
这里aaa
将是您的字符串分隔符。
【讨论】:
以上是关于在原始字符串文字中包含 )" 而不终止所述文字的主要内容,如果未能解决你的问题,请参考以下文章