我正在尝试search and replace with regexs。
假设我有foreach(foo1.txt, foo2.txt, foo3.txt, foo4.txt)
。
我想把“围绕列表中的每个项目。”
我认为 - 从文档中 - 这个正则表达式会起作用
(foo[1-4]\.txt) -> "\&"
。
但事实并非如此。我做错了什么?
答案 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 Course和Steve 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
”。)