能否更改emacs的正则表达式语法?

43

我喜欢emacs。我也喜欢正则表达式。但是我讨厌emacs的正则表达式语法 - 需要转义成组的括号和花括号,不能转义字面意义的括号,缺乏预定义字符类等。

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

编辑: 原标题为“如何更改emacs的正则表达式引擎”,这不仅会改变转义规则和添加字符类,还会(在帖子中未提到)添加对各种常见扩展(?…)的支持。例如非捕获组:(?:...)、只有当/如果不是后面跟着:(?=...)/(?!...),等等。我认为(虽然很高兴被纠正)这些都不可能在emacs当前的正则表达式引擎中实现,无论做多少语法替换都无济于事。

下面的解决方案通过用emacs理解的语法替换来解决了原始问题的转义和附加字符类。第二个答案(现已删除)建议给emacs的正则表达式函数增加一个advice函数,以便在所有正则表达式处理中执行替换。作者迅速自我审查,意识到这可能会破坏很多现有的emacs代码,最终删除了该帖子。

我仍然想更改正则表达式引擎以支持扩展功能,但我同意普遍更改转义行为会造成我不愿意去解决的混乱。因此,我将主题更改为与问题匹配,并接受该回答。

我考虑过更改引擎以支持通用语法和扩展功能,建议正则表达式函数将emacs内部代码转换为通用语法,建议交互函数将我的通用语法转换为emacs语法(以便可以再次转换为通用语法)……但我认为即使是RMS也会建议首先进行分支。


3
严格解释来看,当然Emacs是开源的。但从实用角度考虑,我不确定。 - Tom Ritter
1
这个主题有点误导人。你真正想要改变的不是正则表达式引擎(NFA或DFA),而只是你需要输入的语法。那是完全不同的事情。 - viam0Zah
2
相关主题:PERL和Emacs的正则表达式语法比较 - https://dev59.com/EHI-5IYBdhLWcg3wQV8Z - Yoo
2个回答

15

你可以定义自己的elisp函数,修改正则表达式并将其传回Emacs。 伪代码如下:

(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)

请问您能否提供一两行修改您示例中regexp变量的代码?或者,如果您实际编写了这个函数,是否可以以某种方式分享它? - user2141046

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

visual-regexp-steroids是visual-regexp的扩展,它使现代正则表达式引擎可用(不再需要转义组括号等好处!)...目前,Python和pcre2el都可以直接使用(在Linux和Windows上测试通过)。

它默认使用Python正则表达式

一个非常好的特性是实时搜索/替换,例如从以下内容开始。

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

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

enter image description here

可以通过 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)

但显然您可以进行更改以适应自己的需求,并且如果需要,可以覆盖内置的搜索和替换键映射。


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