2016-03-19 105 views
0

我想用標準C++正則表達式庫從多行字符串中刪除某些行(讓我們假設'aaa'和'bbb')。使用ECMAScript替換語法,我將使用下一個模式:/^(aaa|bbb)$/gm。我試圖通過這樣的正則表達式參數到std::regex_replace,但它不起作用,因爲^$似乎沒有匹配作爲行的開始和結束,雖然我沒有通過match_not_eolmatch_not_bol作爲匹配標誌。那麼對於這種情況,C++模式應該如何?C++正則表達式:用多行替換一個模式

+0

您可以發佈的東西可以複製並粘貼到一個在線的編譯器? – Mikhail

+1

如果你冷靜下來,謹慎地描述,你爲什麼這麼認爲,「這個問題沒有顯示任何研究工作;它不清楚或沒有用」。謝謝 – tonso

+0

我沒有downvote ... – Mikhail

回答

1

regex_replace參考沒有列出任何標誌來重新定義^$的含義。因此,當您需要搜索並替換時,請先使用捕獲組(^|\r?\n),然後在主模式之後使用lookahead (?=\r?\n|$)(並用反向引用$1替換)。當然,可以調整圖案以在更換後允許或不允許清空線條。

IDEONE demo:

std::string s("ccc\r\naaa\r\ngggg"); 
std::regex ee(R"((^|\r?\n)(?:aaa|bbb)(?=\r?\n|$))"); 
std::string newtext = std::regex_replace(s, ee, "$1"); 
std::cout << newtext << std::endl; 

輸出:

ccc 

gggg 
+0

感謝您的回答。實際上,我嘗試了在開始時匹配「(^ | \ n)」,並在模式結尾處匹配「($ | \ n)」,但似乎與前一行中的行不匹配被替換了,可能是因爲開始「(^ | \ n)」是前一場比賽的一部分。如果你在你的例子中用R「((^ | \ r?\ n)(?: ccc | aaa | bbb)(\ r?\ n | $))」替換模式,你可以看到我在說什麼。 – tonso

+0

在這種情況下,請將追蹤捕捉組變成查看方式。使用'std :: regex ee(R「((^ | \ r?\ n)(?: aaa | bbb)(?= \ r?\ n | $))」);'並替換爲一個反向引用$ 1 '。 –

+0

如果我使用'(?= \ r?\ n | $)',它會導致段錯誤,因爲'$'包含在向前看,我猜,但是如果我使用'((?= \ r?\ n )| $)'沒關係。感謝您的幫助 – tonso