57

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

<BarFoo>

<barfoo>

即用正则表达式替换尖括号内的所有内容,用它的小写等效项。

有人有一个很好的 Lisp 片段可以做到这一点吗?假设我们只处理 ASCII 值是安全的。任何足以采用完整正则表达式的通用内容的加分点,并且不仅仅处理尖括号示例。仅使用M-x query-replace-regexp.

谢谢,

多姆

4

3 回答 3

91

尝试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))))
于 2009-03-24T11:38:16.333 回答
0

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

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

<BarFoo baz="Quux">

可以只小写标签名称:

<barfoo baz="Quux">

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

于 2021-02-25T09:19:00.187 回答
0

使用邪恶时,你可以简单地做:%s/<\([^>]+\)>/<\L\1>

\L负责将以下所有字母小写,这也适用于query-replace-regexp.

我没有找到有关 Emacs 的文档,但它似乎与此列表匹配:https ://www.boost.org/doc/libs/1_44_0/libs/regex/doc/html/boost_regex/format/perl_format.html

于 2021-09-05T19:18:47.190 回答