regex - 是否可以更改 emacs 的正则表达式语法?

标签 regex emacs syntax advising-functions

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

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

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

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

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

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

最佳答案

您可以定义自己的 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)

关于regex - 是否可以更改 emacs 的正则表达式语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/879011/

相关文章:

C++ Boost Regex 不保存捕获

arrays - 多次迭代一个文件,每次查找一个正则表达式并返回一行(perl)

windows - 有没有办法在 dired 中列出驱动器号?

ruby - 我怎样才能将双重 splat 参数折叠成空?

java - 转换循环(Java初学者问题)

c# - 正则表达式 .net 拆分

Java作业-无法使匹配正则表达式正常工作

emacs - Racket 模式 : Can I evaluate a single form within a given namespace at the REPL?

unix - Emacs Monky 错误 - 删除旧名称 : no such file or directory

c - 开关盒奇怪的范围