用Emacs替换正则表达式

时间:2009-06-29 21:40:13

标签: regex emacs

我正在尝试search and replace with regexs

假设我有foreach(foo1.txt, foo2.txt, foo3.txt, foo4.txt)。 我想把“围绕列表中的每个项目。”

我认为 - 从文档中 - 这个正则表达式会起作用 (foo[1-4]\.txt) -> "\&"

但事实并非如此。我做错了什么?

4 个答案:

答案 0 :(得分:8)

请注意,括号和圆括号需要在搜索正则表达式中转义(“额外斜杠”),而不能在替换正则表达式中转义。

转义是必需的,因为lisp-parser在正则表达式引擎之前看到正则表达式。

但是,如果你是以编程方式编写的(而不是交互式条目),则需要逃避逃脱! AY义义....

interactive:
M-x replace-regexp RET \(obj.method(.*)\{1\}\) RET trim$(\1)

programmatic:
(replace-regexp "\\(obj.method(.*)\\{1\\}\\)" "trim$(\\1)")
逃脱的parens因为他们正在分组而逃脱,未转义的parens是字面上的parens。

您可能需要查看Emacs Wiki Regex Crash CourseSteve Yegge's Effective Emacs regex section

答案 1 :(得分:2)

尝试类似\(foo[1-4]\.txt\)

的内容

答案 2 :(得分:2)

Emacs regexps总是让我失望,因为他们不是Perl:

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

您需要在Emacs中反斜杠。

答案 3 :(得分: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”。)