在原始字符串文字中包含 )" 而不终止所述文字
Include )" in raw string literal without terminating said literal
两个字符 )"
终止了下面示例中的原始字符串文字。
序列 )"
有时会出现在我的文本中,我希望字符串继续存在,即使在其中找到该序列也是如此。
R"(
Some Text)"
)"; // ^^
如何在不终止的情况下将序列 )"
包含在字符串文字中?
Raw string literals 让您指定一个几乎任意的*分隔符:
//choose ### as the delimiter so only )###" ends the string
R"###(
Some Text)"
)###";
*确切的规则是:“基本源字符集的任何成员,除了:
space,左括号(,右括号),反斜杠\,
和代表水平制表符的控制字符,
垂直制表符、换页符和换行符”(N3936 §2.14.5 [lex.string] 语法)和 "at most 16 characters" (§2.14.5/2)
转义对您没有帮助,因为这是原始文字,但语法旨在通过引入像 aha
.
这样的任意短语来明确区分开始和结束
R"aha(
Some Text)"
)aha";
顺便注意最后的 )
和 "
的顺序,与您的示例相反。
关于正式的,乍一看(研究标准)似乎转义在原始字符串文字中的作用与在普通文字中的作用相同。除非有人知道它没有,那么在规则中没有注明例外情况的情况下,这怎么可能呢?好吧,当在 C++11 中引入原始字符串文字时,它是通过引入额外的 undoing 翻译阶段的方式来撤消例如逃跑!,也就是说,...
C++11 §2.5/3
” Between the
initial and final double quote characters of the raw string, any transformations performed in phases 1
and 2 (trigraphs, universal-character-names, and line splicing) are reverted; this reversion shall apply
before any d-char, r-char, or delimiting parenthesis is identified.
这会处理 Unicode 字符规范(通用字符名称,如 \u0042
),虽然它们看起来和行为都像转义,但在 C++ 中是正式的, 不是转义序列。
通过对原始字符串文字的内容使用自定义语法规则,可以处理真正的正式转义,或者更确切地说,不处理!也就是说,在 C++ §2.14.5 中 raw-string 文法实体被定义为
"
d-char-sequenceopt (
r-char-sequenceopt )
d-char-sequenceopt "
其中 r-char-sequence 定义为 r-char 的序列,其中每个
” any member of the source character set, except
a right parenthesis )
followed by the initial d-char-sequence
[like aha
above] (which may be empty) followed by a double quote "
从本质上讲,以上意味着你不仅不能在原始字符串中直接使用转义符(这很重要,它是积极的,而不是消极的),你也不能直接使用 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";
}
输出:
Ordinary string with a 'B' character.
Raw string without a '\u0042' character, and no \n either.
Raw string without a '\u0042' character, i.e. no 'B' character.
你可以使用,
R"aaa(
Some Text)"
)aaa";
此处 aaa
将是您的字符串分隔符。
两个字符 )"
终止了下面示例中的原始字符串文字。
序列 )"
有时会出现在我的文本中,我希望字符串继续存在,即使在其中找到该序列也是如此。
R"(
Some Text)"
)"; // ^^
如何在不终止的情况下将序列 )"
包含在字符串文字中?
Raw string literals 让您指定一个几乎任意的*分隔符:
//choose ### as the delimiter so only )###" ends the string
R"###(
Some Text)"
)###";
*确切的规则是:“基本源字符集的任何成员,除了: space,左括号(,右括号),反斜杠\, 和代表水平制表符的控制字符, 垂直制表符、换页符和换行符”(N3936 §2.14.5 [lex.string] 语法)和 "at most 16 characters" (§2.14.5/2)
转义对您没有帮助,因为这是原始文字,但语法旨在通过引入像 aha
.
R"aha(
Some Text)"
)aha";
顺便注意最后的 )
和 "
的顺序,与您的示例相反。
关于正式的,乍一看(研究标准)似乎转义在原始字符串文字中的作用与在普通文字中的作用相同。除非有人知道它没有,那么在规则中没有注明例外情况的情况下,这怎么可能呢?好吧,当在 C++11 中引入原始字符串文字时,它是通过引入额外的 undoing 翻译阶段的方式来撤消例如逃跑!,也就是说,...
C++11 §2.5/3” Between the initial and final double quote characters of the raw string, any transformations performed in phases 1 and 2 (trigraphs, universal-character-names, and line splicing) are reverted; this reversion shall apply before any d-char, r-char, or delimiting parenthesis is identified.
这会处理 Unicode 字符规范(通用字符名称,如 \u0042
),虽然它们看起来和行为都像转义,但在 C++ 中是正式的, 不是转义序列。
通过对原始字符串文字的内容使用自定义语法规则,可以处理真正的正式转义,或者更确切地说,不处理!也就是说,在 C++ §2.14.5 中 raw-string 文法实体被定义为
"
d-char-sequenceopt(
r-char-sequenceopt)
d-char-sequenceopt"
其中 r-char-sequence 定义为 r-char 的序列,其中每个
” any member of the source character set, except a right parenthesis
)
followed by the initial d-char-sequence [likeaha
above] (which may be empty) followed by a double quote"
从本质上讲,以上意味着你不仅不能在原始字符串中直接使用转义符(这很重要,它是积极的,而不是消极的),你也不能直接使用 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";
}
输出:
Ordinary string with a 'B' character. Raw string without a '\u0042' character, and no \n either. Raw string without a '\u0042' character, i.e. no 'B' character.
你可以使用,
R"aaa(
Some Text)"
)aaa";
此处 aaa
将是您的字符串分隔符。