【发布时间】:2009-06-29 21:40:13
【问题描述】:
我正在尝试做一个search and replace with regexs。
假设我有一个foreach(foo1.txt, foo2.txt, foo3.txt, foo4.txt)。
我想在列表中的每个项目周围加上 "。
我认为 - 从文档中 - 这个正则表达式可以工作
(foo[1-4]\.txt) -> "\&".
但事实并非如此。我做错了什么?
【问题讨论】:
我正在尝试做一个search and replace with regexs。
假设我有一个foreach(foo1.txt, foo2.txt, foo3.txt, foo4.txt)。
我想在列表中的每个项目周围加上 "。
我认为 - 从文档中 - 这个正则表达式可以工作
(foo[1-4]\.txt) -> "\&".
但事实并非如此。我做错了什么?
【问题讨论】:
请注意,search 正则表达式中的括号和圆括号需要转义(“额外的斜线”),而 replace 正则表达式中则不需要。
转义是必需的,因为 lisp 解析器在正则表达式引擎之前看到正则表达式。
但是,如果您以编程方式编写(而不是交互式输入),则需要转义转义符!哎呀呀呀....
interactive:
M-x replace-regexp RET \(obj.method(.*)\{1\}\) RET trim$(\1)
programmatic:
(replace-regexp "\\(obj.method(.*)\\{1\\}\\)" "trim$(\\1)")
转义的括号被转义,因为它们正在分组,未转义的括号是文字括号。
您可能想查看Emacs Wiki Regex Crash Course 和Steve Yegge's Effective Emacs regex section。
【讨论】:
试试这样的\(foo[1-4]\.txt\)
【讨论】:
Emacs 正则表达式总是让我感到困惑,因为它们不是 Perl:
\(foo[1-4]\.txt\)
您需要在 Emacs 中使用反斜杠。
【讨论】:
您已经得到了关于正则表达式的正确答案,但在这种情况下,使用宏可能会更容易。将点放在名字的开头,然后键入:
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”。)
【讨论】: