Emacs 正则表达式搜索替换的小技巧
文章目录
- 交互式的使用正则表达替换
在Emacs中使用正则表达式替换时并不会像isearch-forward-regexp
那么直观,无法查看到输入的正则表达式是否正确。之前我经常用re-builder
进行表达式的测试,但是这样会打断当前的编辑工作。
经过验证发现可以使用isearch-forward-regexp
代替replace-regexp
,可以先用isearch-forward-regexp
,它能交互式的验证所输入的表达式能否匹配,在匹配上第一个匹配位置时,输入M-%
切换为query-replace
模式,在输入要替换表达式后即可进行替换操作。
- 正则表达式替换重复内容
以将行首
*
、**
、***
替换为同样数量的#
为例:
匹配表达式为:^\(\*\)+
替换表达式为:\, (concat "#" (replace-regexp-in-string "\*" "#" \&))
替换表达式中的\,
表示后面的内容为elisp
表达式,\&
表示匹配表达式所匹配的所有内容,类似的还有\n
,n
为从 1 开始的数字,表示匹配上的分组内容。
- 替换
^M
字符
使用M-%
调用query-replace
,输入C-q
表示要搜索的回车符。
- Emacs 正则表达中的反斜线
在elisp
中使用正则式时,反斜杠有时候会让新手很迷惑。在遇到正则表达式本身的特殊符号时,要两个反斜杠,比如\|、\(等,但在字符转义时,只要一个,如\n、\t、\(表示反斜杠本身)。
另可参考:Emacs Regexp中文手册
在“关于反斜线”一节中出现的反斜线出现在elisp代码中时应该使用两个反斜线。
文章作者 Jamsa
上次更新 2018-05-23