作者cutekid (可愛小孩子)
看板C_and_CPP
標題Re: [問題] regex_replace取代非comment內的內容
時間Mon Oct 8 18:21:26 2018
以下處理 /* */ 這種的註解
#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
推 art1: 原來是沒把 \ 逸出的關係 10/08 22:42
→ art1: c++ 沒支援 raw string 真可惜 10/08 22:43
推 thefattiger: committee:我們聽到了 10/08 22:46
→ thefattiger: 估狗了一下, C++有raw string耶,類似Python的寫法 10/08 22:52
推 art1: 原來有,那用 raw string 還是比較方便,逸出好麻煩的 10/08 23:23
推 LPH66: raw string 是 C++11 才有的新語法喔, 不過比 python 方便 10/09 17:19
→ LPH66: C++11 的 raw string 有多一對括號, 括號外還能塞東西 10/09 17:20
→ LPH66: 這些都是用來避免已經寫了 raw string 還要跳脫東西 10/09 17:20
推 art1: 不懂擷取 group 2 的目的是什麼,如果是我的話會寫成這樣 10/10 22:44
→ art1: ([\\s\\S]*?)(?:\/\\*[\\s\\S]+?\\*\/|$) 10/10 22:44
→ cutekid: 非註解替換,保留註解 10/11 00:08