Re: [問題] regex_replace取代非comment內的內容

看板C_and_CPP作者 (可愛小孩子)時間5年前 (2018/10/08 18:21), 編輯推噓5(506)
留言11則, 4人參與, 5年前最新討論串2/2 (看更多)
以下處理 /* */ 這種的註解 #include <iostream> #include <regex> using namespace std; int main() { string text = "\/*comment 1*\/text1\n\/*comment 2*\/text2\n"; string pattern = "([\\s\\S]*?)((?:\/\\*[\\s\\S]+?\\*\/)|$)"; regex re(pattern); cout << "pattern: " << pattern << endl; cout << regex_replace(text,re,"$2"); return 0; } 程式: https://ideone.com/7eCkXG 參考: http://www.cplusplus.com/reference/regex/regex_replace/ ※ 引述《boy770329 (A-So)》之銘言: : 問個regular expreesion的問題 因為試了很久還是找不到解 : 現在想用regex_replace去取代SQL query內的某個字串,條件是那個字串不在註解內 : 因為SQL的註解寫法有一行的--或# : 多行的/* ... */ : 然後C++的regex只支援lookahead 處理一行註解還可以,但是多行的就會有問題 : 目前寫的regex 長這樣 : ^(?:(?!\-\-)(?!\#).)*取代的字串regex : 大致上就是遇到--或是#就assert不處理,這樣可以有效跳過單行註解 : 用類似的邏輯想處理多行註解時就會遇到問題 : ^(?:(?!\-\-)(?!\#)(?!\/\*).)*取代的字串regex : 因為query可能會長得像SELECT * /*註解*/ from table where... : 會導致一遇到/*後面的東西也都不繼續處理 : 試了半天還是想不到除了先把/*...*/從input query中去掉的解 : 不知道有沒有版友有類似的經驗可以用C++支援的regex語法處理跳過這種情況做replace -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.221.80.36 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1538994090.A.1CE.html

10/08 22:42, 5年前 , 1F
原來是沒把 \ 逸出的關係
10/08 22:42, 1F

10/08 22:43, 5年前 , 2F
c++ 沒支援 raw string 真可惜
10/08 22:43, 2F

10/08 22:46, 5年前 , 3F
committee:我們聽到了
10/08 22:46, 3F

10/08 22:52, 5年前 , 4F
估狗了一下, C++有raw string耶,類似Python的寫法
10/08 22:52, 4F

10/08 23:23, 5年前 , 5F
原來有,那用 raw string 還是比較方便,逸出好麻煩的
10/08 23:23, 5F

10/09 17:19, 5年前 , 6F
raw string 是 C++11 才有的新語法喔, 不過比 python 方便
10/09 17:19, 6F

10/09 17:20, 5年前 , 7F
C++11 的 raw string 有多一對括號, 括號外還能塞東西
10/09 17:20, 7F

10/09 17:20, 5年前 , 8F
這些都是用來避免已經寫了 raw string 還要跳脫東西
10/09 17:20, 8F

10/10 22:44, 5年前 , 9F
不懂擷取 group 2 的目的是什麼,如果是我的話會寫成這樣
10/10 22:44, 9F

10/10 22:44, 5年前 , 10F
([\\s\\S]*?)(?:\/\\*[\\s\\S]+?\\*\/|$)
10/10 22:44, 10F

10/11 00:08, 5年前 , 11F
非註解替換,保留註解
10/11 00:08, 11F
文章代碼(AID): #1Rko-g7E (C_and_CPP)
文章代碼(AID): #1Rko-g7E (C_and_CPP)