2008-09-11 81 views
9

我想找到的形式噸的正則表達式匹配的文件中的任何文本[A-Z]ù(即比賽後跟一個大寫字母和另一場比賽ü,因此,資本字母小寫轉換匹配的文本。例如,對於正則表達式x[A-Z]yEmacs的查詢替換

xAy 

成爲

xay 

xZy 

成爲

xzy 

Emacs的query-replace功能允許反向引用,但AFAIK不匹配的文本的轉變。有沒有一個內置函數可以做到這一點?有人可以使用一個簡短的Elisp函數嗎?

UPDATE

@Marcel利維有它:\,在替換表達式引入了一個(任意?)elisp的表達。例如,解決上面是

M-x replace-regexp <RET> x\([A-Z]\)z <RET> x\,(downcase \1)z 

回答

13

它看起來像Steve Yegge實際上已經發布的答案,這在幾年前:"Shiny and New: Emacs 22."向下滾動到「在替換字符串修改案」,你會看到他的示例代碼使用replace-regexp函數。

一般的答案是,您使用「\,」來調用任何lisp表達式作爲替換字符串的一部分,如\,(capitalize \1)。閱讀幫助文本,它看起來像只在交互模式,但這似乎是最需要的地方。

1

在這種情況下,qrr的替代方法是錄製宏並重播它。 (isearch-forward-regexp,選擇字符,downcase-region。)我在飛行宏中查找更容易,因爲如果您的正則表達式錯誤,您會立即得到反饋。

0

我會用宏來做到這一點,但僅僅是因爲從正則表達式的替換字符串中執行代碼對我來說是非常不直觀的。如果你正在編寫批處理腳本或者需要非常快速的東西,\,肯定是要走的路。