Emacs:正则表达式替换为更改大小写

时间:2009-03-24 11:33:08

标签: regex emacs replace

每隔一段时间我就想替换所有值的实例,例如:

<BarFoo>

<barfoo>

即。使用小写等效项替换尖括号内的所有内容。

任何人都有一个很好的Lisp片段吗?假设我们只处理ASCII值是安全的。任何通用的足以获得完整正则表达式的奖励点,并不只是处理尖括号示例。更多奖励指向仅使用M-x query-replace-regexp的答案。

谢谢,

的Dom

2 个答案:

答案 0 :(得分:74)

尝试M-x query-replace-regexp"<\([^>]+\)>"作为搜索字符串,"<\,(downcase \1)>"作为替代。

这应该适用于Emacs 22及更高版本,请参阅此Steve Yegge blog post以获取有关如何在替换字符串中使用Lisp表达式的更多详细信息。

对于早期版本的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))))

答案 1 :(得分:0)

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

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

(concat "<" (downcase \1) ">")

可以只将标签名称小写:

<BarFoo baz="Quux">

通过使用搜索字符串 <barfoo baz="Quux"> 和替换 <\([A-Za-z]+\)\([^>]*\)>(这也适用于看起来像没有属性的标签的 OP 示例)。