首頁  >  問答  >  主體

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

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

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

怪我咯怪我咯2714 天前538

全部回覆(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
  • 取消回覆