我想用標準C++正則表達式庫從多行字符串中刪除某些行(讓我們假設'aaa'和'bbb')。使用ECMAScript替換語法,我將使用下一個模式:/^(aaa|bbb)$/gm
。我試圖通過這樣的正則表達式參數到std::regex_replace
,但它不起作用,因爲^
和$
似乎沒有匹配作爲行的開始和結束,雖然我沒有通過match_not_eol
或match_not_bol
作爲匹配標誌。那麼對於這種情況,C++模式應該如何?C++正則表達式:用多行替換一個模式
回答
regex_replace
參考沒有列出任何標誌來重新定義^
和$
的含義。因此,當您需要搜索並替換行時,請先使用捕獲組(^|\r?\n)
,然後在主模式之後使用lookahead (?=\r?\n|$)
(並用反向引用$1
替換)。當然,可以調整圖案以在更換後允許或不允許清空線條。
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
感謝您的回答。實際上,我嘗試了在開始時匹配「(^ | \ n)」,並在模式結尾處匹配「($ | \ n)」,但似乎與前一行中的行不匹配被替換了,可能是因爲開始「(^ | \ n)」是前一場比賽的一部分。如果你在你的例子中用R「((^ | \ r?\ n)(?: ccc | aaa | bbb)(\ r?\ n | $))」替換模式,你可以看到我在說什麼。 – tonso
在這種情況下,請將追蹤捕捉組變成查看方式。使用'std :: regex ee(R「((^ | \ r?\ n)(?: aaa | bbb)(?= \ r?\ n | $))」);'並替換爲一個反向引用$ 1 '。 –
如果我使用'(?= \ r?\ n | $)',它會導致段錯誤,因爲'$'包含在向前看,我猜,但是如果我使用'((?= \ r?\ n )| $)'沒關係。感謝您的幫助 – tonso
- 1. C++正則表達式多行替換
- 2. 正則表達式:使用一個正則表達式替換同一行內的多個模式
- 3. 用正則表達式替換另一個表達式替換
- 4. 用另一個正則表達式替換正則表達式
- 5. 正則表達式:用另一個替換一個模式
- 6. Python正則表達式多行替換
- 7. 多行正則表達式替換
- 8. Python多行正則表達式替換
- 9. 多行正則表達式替換
- 10. javascript多行正則表達式替換
- 11. 替換多個正則表達式到perl的正則表達式的一個
- 12. Powershell正則表達式替換模式
- 13. 正則表達式替換模式 - PHP
- 14. 正則表達式來替換模式
- 15. 正則表達式:「替換」模式
- 16. ASP.Net正則表達式替換模式
- 17. vbscript多個替換正則表達式
- 18. 多個正則表達式替換
- 19. grep正則表達式多個替換
- 20. Java正則表達式 - 多個替換
- 21. C#正則表達式替換爲正則表達式
- 22. 在運行時替換模式的正則表達式(C#3.0)
- 23. 正則表達式替換模式匹配的多行
- 24. 用正則表達式替換C#
- 25. 正則表達式奇異替換的多個模式
- 26. 正則表達式匹配並替換多個模式
- 27. 使用正則表達式替換模式替換字符串
- 28. 「正則表達式模式無效」,而用數組替換正則表達式
- 29. 用C#正則表達式替換字符串模式
- 30. C#使用字典替換正則表達式匹配模式
您可以發佈的東西可以複製並粘貼到一個在線的編譯器? – Mikhail
如果你冷靜下來,謹慎地描述,你爲什麼這麼認爲,「這個問題沒有顯示任何研究工作;它不清楚或沒有用」。謝謝 – tonso
我沒有downvote ... – Mikhail