在原始字符串文字中包含 )" 而不终止所述文字

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-charr-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 将是您的字符串分隔符。

【讨论】:

以上是关于在原始字符串文字中包含 )" 而不终止所述文字的主要内容,如果未能解决你的问题,请参考以下文章

如何用IF函数判断一个单元格内的文本中包含某几个字

6.02 字符串文字中包含引号

如果此类字符串在Javascript中包含逗号,则正则表达式获取引号之间的文字字符串的内容

在 C 字符串中包含双引号 (") [重复]

如何使用 Jackson 在对象中包含原始 JSON?

在 Java 中拆分其数据中包含逗号和特殊字符的 csv 文件