搜索

首页  >  问答  >  正文

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

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

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

怪我咯怪我咯2804 天前591

全部回复(3)我来回复

  • 阿神

    阿神2017-04-17 15:27:28

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

    先说R,这是代表Raw String

    比如以下文本

     abc
         efg\n

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

    "abc\n\tefg\n"

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

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

    R"(abc
        efg\n)"

    也就是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

    回复
    0
  • 巴扎黑

    巴扎黑2017-04-17 15:27:28

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

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

    输出

    \non\t-\t"escape"

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

    "('(?:[^\']|\.)*'|"(?:[^\"]|\.)*")|"

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

    "('(?:[^\\']|\\.)*'|\"(?:[^\\\"]|\\.)*\")|"

    回复
    0
  • 阿神

    阿神2017-04-17 15:27:28

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

    回复
    0
  • 取消回复