使用Emacs进行正则表达式替换

8

我想要做一个用正则表达式进行搜索和替换

假设我有一个foreach(foo1.txt, foo2.txt, foo3.txt, foo4.txt),我想在列表中的每个项目周围加上引号。

我认为- 根据文档 - 这个正则表达式应该可以工作:(foo[1-4]\.txt) -> "\&"

但它不起作用。我做错了什么?

4个回答

9
请注意,在搜索正则表达式中,需要转义方括号和圆括号(即添加“额外的斜杠”),但在替换正则表达式中不需要。
这些转义是必需的,因为lisp解析器在正则表达式引擎之前看到了正则表达式。
但是,如果您是以编程方式编写代码(而不是交互式输入),则需要转义这些转义字符!天哪...
interactive:
M-x replace-regexp RET \(obj.method(.*)\{1\}\) RET trim$(\1)

programmatic:
(replace-regexp "\\(obj.method(.*)\\{1\\}\\)" "trim$(\\1)")

转义的括号是因为它们是分组,未转义的括号是字面上的括号。

你可能想查看Emacs Wiki正则表达式入门教程Steve Yegge的Effective Emacs正则表达式部分


2
有帮助,但有点可怕。 "逃脱转义符"。咩。 - Paul Nathan

2

Try something like this \(foo[1-4]\.txt\)


2

Emacs正则表达式总是让我困惑,因为它们不像Perl那样:

\(foo[1-4]\.txt\)

你需要在Emacs中使用反斜杠转义括号。

1

关于正则表达式,你已经得到了正确的答案,但在这种情况下,使用宏可能会更容易。将光标放在第一个名称的开头,然后键入:

C-x ( " M-f M-f " C-f C-f C-x )

也就是说,开始录制宏,插入引号,向前移动两个单词,插入引号,向前移动两个字符以获取下一个元素,然后停止录制宏。

然后使用C-x e运行宏。要重复执行,只需再次按下e即可。

(在Emacs 23中,您可以使用F3代替'C-x (',使用F4代替'C-x )'和'C-x e'。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接