43

我喜欢emacs。我喜欢正则表达式。我讨厌 emacs 的正则表达式语法 - 需要转义分组括号和大括号,您转义文字括号,缺少预定义的字符类等。

我可以替换 emacs 的正则表达式引擎,或者调整一些设置,以便当我使用 Query-replace-regexp(或许多其他功能之一)时,我可以使用我在 java/js/perl/ruby/etc 中编写的语法...?

编辑: 主题最初是“如何更改 emacs 的正则表达式引擎”,它不仅会更改转义规则并添加字符类,而且(帖子中未提及)添加对各种常见扩展的支持(?...)。诸如非捕获括号之类的功能:(?:...),仅当/如果-不匹配时才匹配:(?=...)/(?!...) 等。我不相信(尽管很高兴得到纠正)这些是 emacs 当前的正则表达式引擎可能实现的,并且没有任何语法替换可以解决这个问题。

下面的解决方案通过替换为 emacs 理解的语法来解决转义和附加 char 类的原始问题。第二个答案(现已删除)建议建议(添加一个在另一个开头运行的函数)emacs 的正则表达式函数来替换所有正则表达式处理。作者很快审查了他/她自己,意识到这可能会破坏许多现有的 emacs 代码,最终该帖子被删除。

我仍然想将正则表达式引擎更改为支持扩展的引擎,但我同意普遍更改转义行为会造成严重破坏,我不愿意追逐。因此,我正在更改主题以匹配问题并接受回复。

我突然想到要更改引擎以支持通用语法和扩展,建议正则表达式函数将 emacs 内部代码转换为通用语法,建议交互式函数将我的通用语法转换为 emacs 语法(所以它可以是转换回通用)...但我认为即使是 RMS 也会在此之前推荐一个分叉。

4

2 回答 2

15

您可以定义自己的 elisp 函数来修改正则表达式,然后将其传递回 emacs。在伪 elisp 中:

(defun my-query-replace-regexp (regexp)
    ; modify regexp to replace ( with \(, { with \{, etc.
    (query-replace-regexp modified-regexp)
)

; rebind C-% to use new regexp function
(global-set-key "\C-%" 'my-query-replace-regexp)
于 2009-05-18T18:09:52.713 回答
7

如果使用 Python 正则表达式进行增量搜索/替换,并且对于替换和查询替换就足够了,那么visual-regexp-steroids是一个不错的选择。

visual-regexp-steroids 是 visual-regexp 的扩展,它支持使用现代正则表达式引擎(不再有转义的组括号和其他好东西!)...目前,开箱即用地支持 Python 和 pcre2el(在Linux 和 Windows)。

它默认为Python 正则表达式

一个非常好的功能是实时搜索/替换,例如从

one = 1
two = 2
three = 3
four = 4

你可以像这样交换数字和字符串:

在此处输入图像描述

它可以通过MELPA轻松安装。我的 .emacs 是:

(require 'visual-regexp-steroids)
(define-key global-map (kbd "C-c r") 'vr/isearch-backward)
(define-key global-map (kbd "C-c s") 'vr/isearch-forward)
(define-key global-map (kbd "C-c l") 'vr/replace)
(define-key global-map (kbd "C-c q") 'vr/query-replace)

但显然您可以更改以适应,并根据需要覆盖用于搜索和替换的内置键映射。

于 2015-02-09T21:40:02.667 回答