作为一名C++书看得少得可怜的新手,我一直没有勇气去系统地学习一下C++ 11添加的新特性。不过,平日里逛论坛,阅读大犇们的博客,倒是了解了一些。比如,这个帖子:

如何绕过g++ 4.8.1那个不能在宏里面使用R"(...)"的bug?

看到形如:R"" 这样的写法,相信学过Python的童鞋会感到似曾相识。Python支持所谓的“raw string”。Python文档这样介绍raw string:

Both string and bytes literals may
optionally be prefixed with a letter 'r' or 'R'; such strings are called
raw strings and treat backslashes as literal characters. As a result,
in string literals, '\U' and '\u' escapes in raw
strings are not treated specially. Given that Python 2.x’s raw unicode
literals behave differently than Python 3.x’s the 'ur' syntax is not
supported.
从这段文字中我们可以看出,raw string最大的特点就是:它不会对反斜杠'\'进行特殊的转义处理。
那么,它的这一特性有什么好处呢?
不用正则,不知raw string大法好!我们知道,正则表达式里,有很多元字符,当没有raw string时,我们需要在书写正则表达式的时候使用'\\'来表示元字符里的'\',这样将导致正则表达式变得冗长,而且可读性也会降低。

C++ 11中的raw string,简化了我们在使用regex库时正则表达式的书写。下面是我找到的一些资料:

C++11 raw strings literals tutorial
Wikipedia: C++ 11 # New String Literals

示例代码:

#include <iostream>
#include <string> int main()
{
// 一个普通的字符串,'\n'被当作是转义字符,表示一个换行符。
std::string normal_str = "First line.\nSecond line.\nEnd of message.\n";
// 一个raw string,'\'不会被转义处理。因此,"\n"表示两个字符:字符反斜杠 和 字母n。
// 注意其语法格式,稍后会介绍C++ 11中为什么会采用这种语法格式来表达一个raw string。
std::string raw_str = R"(First line.\nSecond line.\nEnd of message.\n)"; std::cout << normal_str << std::endl;
std::cout << raw_str << std::endl;
std::cout << R"foo(Hello, world!)foo" << std::endl; // raw string可以跨越多行,其中的空白和换行符都属于字符串的一部分。
std::cout <<R"(
Hello,
world!
)" << std::endl; return ;
}

上面这段代码及其中注释大致讲解了C++ 11中的raw string的特点。但是为什么我们要在字符串中使用一对小括号呢?
我找到了如下资料:

What is the rationale for parenthesis in C++11's raw string literals R“(…)”?

C++11 FAQ中文版:原生字符串标识

示例代码:

#include <iostream>

int main()
{
// 下面两行代码意图说明C++ 11采用一对圆括号以及自定义分割字符串来表示raw string的原因。
// 1.
// 如果没有一对圆括号及空的分割字符串做定界处理,R"""将会出现语法错误。Python中,r"""也不会是一个合法的
// raw string literal。
std::cout << R"(")" << std::endl; // 输出一个双引号:"
// 2.
// 自定义分割字符串为:delimiter。分割字符串的长度以及其中包含的字符集,都有明文规定。维基百科:
// The string delimiter can be any string up to 16 characters in length, including the empty string.
// This string cannot contain spaces, control characters, '(', ')', or the '\' character.
//
// 如果不使用自定义分割字符串,这里:R"()")"编译器无法识别raw string在何处结束。自定义分割字符串的用途
// 维基百科中也有介绍:
// The use of this delimiter string allows the user to have ")" characters within raw string literals.
std::cout << R"delimiter()")delimiter" << std::endl; // 输出:)" return ;
}

所以,小伙伴们以后在C++ 11中书写正则表达式的时候,记得用raw string literals啊。

C++11中的raw string literals的更多相关文章

  1. 利用宏方便地书写raw string literals

    以前一直没用过标准库的regex,今天写一个hlsl的解析工具的时候用了一下,发现用字符串字面值写regular expression的时候非常不方便,特别是每个“\”字符都要被识别为转义,只能写成“ ...

  2. python中的raw string的使用

    背景 我们经常需要使用raw string,在应用过程中,比如要使字符串中带一些转义字符或者其他的一些符号,我们就需要保持我们的字符成为raw string. 实例 输入 s = 'fadfafa\n ...

  3. C++ 11中几个我比较喜欢的语法(二)

    之前在文章C++ 11中几个我比较喜欢的语法中介绍了几个我比较喜欢的C++语法,其中有些语法由于VC 11还不支持,无法跨平台,所以没有介绍.前几天VS 2013 Preview发布后,对C++ 11 ...

  4. python raw String 获取字符串变量中的反斜杠

    常用的获取raw string的方式为: >>>r'\n' \n 不能用在字符串变量中,获取字符串变量中的反斜杠如下: tab = '\n' >>>tab.enco ...

  5. C++11中int,float,double与string的转化

    在C++11中可以使用std::to_string()函数将数值转换为string格式,十分方便. 以下部分来选自cplusplus.com. std::to_string string to_str ...

  6. C++11中的小细节--字符串的原始字面量

    原始字面量很容易理解,即不进行转义的完整字符串. 最近看了看Python,其中讲到了原始字符串. Both string and bytes literals may optionally be pr ...

  7. 从linux0.11中起动部分代码看汇编调用c语言函数

    上一篇分析了c语言的函数调用栈情况,知道了c语言的函数调用机制后,我们来看一下,linux0.11中起动部分的代码是如何从汇编跳入c语言函数的.在LINUX 0.11中的head.s文件中会看到如下一 ...

  8. Java中如何将String转成Date

    Java中如何将String转成Date 最近在开发Json数据反序列化为Java对象的时候发现spring mvc 和 Jackson 对Date类型对支持不是特别好,虽然在Java对象序列化为Js ...

  9. C++11中对类(class)新增的特性

    C++11中对类(class)新增的特性 default/delete 控制默认函数 在我们没有显式定义类的复制构造函数和赋值操作符的情况下,编译器会为我们生成默认的这两个函数: 默认的赋值函数以内存 ...

随机推荐

  1. Android平台介绍

    一.Android平台介绍 什么是智能手机 具有独立的操作系统,独立的运行空间,可以由用户自行安装软件.游戏.导航等第三方应用程序,并可以通过移动通讯网络来实现无线网络接入的手机类型总称. 智能手机操 ...

  2. Dream------scala--类的属性和对象私有字段实战详解

    Scala类的属性和对象私有字段实战详解 一.类的属性 scala类的属性跟java有比较大的不同,需要注意的是对象的私有(private)字段 1.私有字段:字段必须初始化(当然即使不是私有字段也要 ...

  3. Oracle 11.2.0.4在线(Online mode)打补丁14084247解决WRH$_ACTIVE_SESSION_HISTORY不会自动切割的问题

      安装了Oracle Database Release 11.2.0.4之后,发现WRH$_ACTIVE_SESSION_HISTORY始终不会自动分割删除,   后来才发现需要应用补丁:14084 ...

  4. 让arch阻止某个软件包的升级

    我更新了eclipse-java Mars版本的,感觉特别的卡,而且还有好多bug,不知道为什么,因此我去官网下载了luna版本的eclipse的安装包,不知道怎么下载的点击这里,然后安装luna版本 ...

  5. 【FCS NOI2018】福建省冬摸鱼笔记 day4

    第四天. 动态规划专题,讲师:闫神 讲了一些DP优化技巧,然而思想难度好大啊……根本没想到能优化那地步,连DP方程都没有呢. 不过有几题我还是想明白了. 讲了单调队列,决策单调性,四边形不等式,斜率优 ...

  6. 2018ICPC南京网络赛

    2018ICPC南京网络赛 A. An Olympian Math Problem 题目描述:求\(\sum_{i=1}^{n} i\times i! \%n\) solution \[(n-1) \ ...

  7. 十六、springboot整合Spring-data-jpa(二)之通用DAO接口与添加自定义方法

    @NoRepositoryBean:Spring Data Jpa在启动时就不会去实例化BaseRepository这个接口 1.通用接口: import org.springframework.da ...

  8. R语言以及RStdio的安装

    R语言: 首先从官网上下载R安装包, 提供了Linux, (Mac) OS X, Windows的安装包相关下载链接. RStdio: RStdio(官网)是R言语非常实用的IDE, 是一个免费的软件 ...

  9. 动态RNN和静态RNN区别

    调用static_rnn实际上是生成了rnn按时间序列展开之后的图.打开tensorboard你会看到sequence_length个rnn_cell stack在一起,只不过这些cell是share ...

  10. Oracle 函数 “数据控制,指定某些人只能查看他权限范围内的信息”

    create or replace function work_plan_mask (p_schema VARCHAR2,p_table VARCHAR2) return Varchar2 AS -- ...