2013-04-25 107 views
1

在Emacs的正则​​表达式,我在做替换,正则表达式,搜索出该如何在Emacs Regexp中替换多个匹配的字符串?

<span class="small">\([^<]+\)</span>\([^<]+\)<span class="small">\([^<]+\)</span>

,并试图用这种

<span class="small">\1\2</span>

我试图以连接来取代它两个匹配的字符串我究竟做错了什么?

+2

我看到你有一堆的正则表达式的问题。我强烈推荐使用'M-x re-builder'(又名'regexp-builder'),它可以让你交互地构建一个regexp,同时动态地显示你(在你调用的缓冲区中)模式和每个子组匹配的内容。有关文档,请参阅'M-x find-library RET重新构建器RET'中的注释,以及使用重构器缓冲区中的'C-h m'来查看可用的键绑定。你*需要确保你理解不同的语法 - 特别是“读”与“字符串” - 否则反斜杠可能会导致混淆。 – phils 2013-04-25 20:52:01

+0

@phils谢谢,你是对的,正则表达式生成器真的很有帮助。 – incandescentman 2013-04-26 05:26:10

回答

2

没有描述它如何不适合你,我只能猜测你打算用\1\3而不是\1\2来代替。

第二种可能性是您正在操作的文本与您的正则表达式实际上不匹配。

(switch-to-buffer (get-buffer-create "nst.html")) 
(insert "<span class=\"small\">foo</span>bar<span class=\"small\">baz</span>") 
(goto-char (point-min)) 
(replace-regexp 
    "<span class=\"small\">\\([^<]+\\)</span>\\([^<]+\\)<span class=\"small\">\\([^<]+\\)</span>" 
"<span class=\"small\">\\1\\3</span>") 

在缓冲区中尝试M-x undo以查看替换操作之前的样子。

(我想失去文本\2是你的意图?)

+1

此外,由于它们不使用\ 2,第二个匹配器部分不需要围绕它的\(和\)。然后\ 1 \ 2将工作。 – 2013-04-26 05:14:30

相关问题