正则表达式 - 请教一个 c++11的 正则语法

浏览:51日期:2023-03-28

问题描述

R'xxx()xxx': xxx可以被替换成任何字符串,不可以包含括号和双引号,而且你需要保证两边是一样的。如果你这样写,那么括号里面的任何字符都不会被转义,甚至是换行符也没有问题。这种字符串语法用来写正则表达式就特别的方便。

可以详细说下用法吗, 感觉不是很理解.

问题解答

回答1:

不知道你是不明白R还是不明白xxx,那我就都说说吧

先说R,这是代表Raw String

比如以下文本

abc efgn

在没有Raw String之前,你要这样写

'abcntefgn'

字符串里的特殊符号都要经过转义

但是有了Raw String之后,你可以这样写

R'(abc efgn)'

也就是Raw String括号里面的文本是所见即所得

可能你会奇怪,为什么需要一对括号?

考虑一下文本

abc'efg

如果没有括号,那就会写成R'abc'efg',这样就无法判断哪个是配对的双引号因此需要引入括号来定界了

引入括号了以后,如果原始文本中有引号+括号呢?比如

abc)'efg

按上面的写法,就需要写成R'(abc)'efg)',这显然会导致语法错误,无法判断哪个是配对的)'显然,在文本包含有)'的情况下下,()不足以定界

因此需要自定义delimiter(定界符),就是你题目中的xxx(...)xxx,上面的字符串就可以写成R'xxx(abc)'efg)xxx',这样编译器就可以分辨出包含在xxx(...)xxx里面的都是原始文本,当然xxx可以任你自定义,你也可以写成ab(...)ab

回答2:

这是C++11里面的raw string literals

#include <iostream>int main(){ std::cout << R'delimiter(nont-t'escape')delimiter' << std::endl; return 0;}

输出

nont-t'escape'

也就是括号中间的不会被转义,按原样输出。因为正则表达式里面''用得比较多,所以这种方式避免了''要转换成''的问题。比如:

'(’(?:[^’]|.)*’|'(?:[^']|.)*')|'

如果不用这种方式,那就需要写成这样:

'(’(?:[^’]|.)*’|'(?:[^']|.)*')|'回答3:

自定义分割字符串的用途:识别raw string在何处结束。

相关文章: