Emacs:如何使用正则表达式替换字符串?

时间:2010-01-05 02:22:40

标签: regex emacs replace

假设我在emacs中打开的文本文件(或dired缓冲区)中有以下内容: file_01.txt file_02.txt ... file_99.txt

我想查询 - 替换或替换文件 01_file.txt等

我想使用query-replace-regexp或replace-regexp,但不知道要放入什么。搜索部分我放入“file_ ..”,但“..”被读作句点替换字符串。我开始学习regexp并且不知道如何做到这一点。请帮助,谢谢。

2 个答案:

答案 0 :(得分:24)

M-x replace-regexp调用函数替换为正则表达式。

对于替换正则表达式,请输入:\(file\)_\([0-9]+\)

这将创建两个组,一个匹配'file'部分,另一个匹配该数字。大括号\( ... \)是在替换字符串中稍后可用匹配所必需的。

对于替换为,请输入:\2_\1

这将从搜索字符串(数字部分)插入第二个匹配项,添加_(下划线),然后添加搜索字符串中的第一个匹配项(“文件”)。

有关Emacs正则表达式的更多信息,请参阅Regexp SyntaxRegexp Replace

掌握了正则表达式基础知识后,您可能需要查看带有M-x re-builder的Emacs ReBuilder工具,这样您就可以交互式构建正则表达式。

答案 1 :(得分:1)

我正在尝试重复此示例以用于学习目的。

我有一个缓冲区 file_01.txt file_02.txt file ...

使用re-builder表达式\(file\)_\([0-9]+\)不起作用,但有必要将\\(file\\)_\\([0-9]+\\)之类的转义加倍。

由于涉及到这个问题,我尝试了上面所写的内容,但无济于事。

以下命令

M-x replace-regexp \(file\)_\([0-9]+\)\\(file\\)_\\([0-9]+\\)

替换为

\2_\1\\2_\\1

总是会产生Replaced 0 occurences。也就是说,无论圆括号前的\是单倍还是加倍。

很明显,我在这里遗漏了一些明显的东西。你能解释一下吗?

我使用的是GNU Emacs 24.3.1(x86_64-pc-linux-gnu,GTK + 3.10.7版)