2009-08-20 25 views
24

你如何在Emacs中查詢替換正則表達式,將跨多行匹配?Emacs查詢替換正則表達式多行

作爲一個簡單的例子,我想<p>\(.*?\)</p>匹配

<p>foo 
bar 
</p> 
+1

我假設你看到emacswiki:http://www.emacswiki.org/emacs/MultilineRegexp – seth 2009-08-20 22:11:46

+1

是的,我看到了,但無法使用query-replace-regexp讓它工作。仍然嘗試使用重新構建器來測試它...希望我會盡快弄清楚 – 2009-08-20 22:21:15

+1

這個例子非常糟糕,因爲用正則表達式解析HTML通常不是一個好主意。 – Svante 2009-08-20 22:48:17

回答

20

嘗試字符類。只要你只使用ASCII字符集,你可以使用[[:ascii:]]而不是點。使用更長的[[:ascii:][:nonascii:]]應該適用於一切。

+0

真棒感謝兄弟 – 2009-08-20 22:27:15

+1

如果你不使用只是ASCII? – Jackson 2014-11-26 02:48:31

+0

[[:ascii:] [:nonascii:]] *給我堆棧溢出 – helcim 2015-04-16 13:38:49

22
M-x re-builder 

是你的朋友。它使我這個正則表達式:

"<p>\\(.\\|\n\\)*</p>" 

這是

<p>\(.\|^J\)*</p>   ;# where you enter ^J by C-q C-j 

字符串版本和工作對我來說,當我做重新搜索前進,而不是當我做'query-replace-regexp。不確定爲什麼...

現在,在做're-search-forward(又名C-u C-s)時,您可以鍵入M-%,這將提示您替換(從Emacs 22開始)。所以,你可以使用它來做你的搜索,並用上面的正則表達式替換。

注意,上述正則表達式匹配,直到緩衝區,這可能不是你想要的東西找到了最後</p>,所以使用重新生成器來構建一個更接近你想要什麼的正則表達式。很顯然,正則表達式不能計算括號,所以你自己爲此 - 取決於你想要的解決方案有多強大。

+0

是否有重新構建器的信息文件?我很好奇如何使用它。 – seth 2009-08-20 22:19:21

+1

不是我能找到的。 Emacs Wiki也沒有太多內容。但它是不言自明的(並不是所有的Emacs :)。進入're-builder'後,輸入'C-c C-h',你會得到一個綁定列表,包括那些適用於're-builder'的綁定列表,所有綁定都以'C-c'開始。 – 2009-08-20 22:22:26

+0

耶,我得到了那麼多。只是尋找更深入的東西。謝謝! – seth 2009-08-20 22:24:03