Emacs:使用正则表达式替换以改变大小写

61

偶尔我想替换所有类似于以下值的实例:

<BarFoo>
与之。
<barfoo>

也就是说,使用正则表达式替换尖括号内的所有内容为其小写形式。

有人有一个漂亮的Lisp片段来做到这一点吗?可以安全地假设我们只处理ASCII值。如果能够编写一个通用的完整正则表达式,并且不仅仅处理尖括号的示例,则可获得额外的奖励分数。更多的奖励分数适用于使用M-x query-replace-regexp的答案。

谢谢,

Dom

3个回答

99
尝试使用M-x query-replace-regexp,将"<\([^>]+\)>"作为搜索字符串,将"<\,(downcase \1)>"作为替换文本。这适用于Emacs 22及更高版本,有关如何在替换字符串中使用Lisp表达式的详细信息,请参见Steve Yegge博客文章
对于较早版本的Emacs,您可以尝试类似以下内容:
(defun tags-to-lower-case ()
  (interactive)
  (save-excursion
    (goto-char (point-min))
    (while (re-search-forward "<[^>]+>" nil t)
      (replace-match (downcase (match-string 0)) t))))

11
太棒了!我之前不知道 Emacs 正则表达式中的 ,()。 - emk
1
这会让我得到错误信息:“替换文本中使用了无效的`'”。 - Dominic Rodger
1
正则表达式应为“<\([^>]+\)>”,如果搜索字符串匹配全部大写标记,则替换无法按预期工作。 - Eugene Morozov
6
Emacs可以将".*?"作为非贪婪匹配处理。 - ashawley
1
回复:这会让我出现"Invalid use of `' in replacement text"错误 - 如果你通过redo (M-x esc esc)编辑之前的命令,你会遇到这个问题,因为M-x query-replace-regexp命令似乎用实际的lisp表达式替换了,()。如果你运行M-x query-replace-regexp,你可以在替换表达式中使用,()。 - Avi Tevet
显示剩余5条评论

0

我知道这个问题很古老,但是我刚刚发现在Emacs之前版本22(我的版本是21.3.1)中如何做到这一点,而不需要定义自定义的Lisp函数:使用M-x query-replace-regexp-eval(在this Emacs wiki page的顶部提到)作为搜索字符串,<\([^>]+\)>作为搜索字符串,(concat "<" (downcase \1) ">")作为替换。

这适用于任何可以定义为部分连接的替换字符串,包括未被任何函数修改的捕获组。例如:

<BarFoo baz="Quux">

标签名称可以只小写:

<barfoo baz="Quux">

通过使用搜索字符串<([A-Za-z]+)\([^>]*\)>和替换(concat "<" (downcase \1) \2 ">")(这也适用于看起来像没有属性的标签)来实现。 这与 OP 的示例也是有效的。

0

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