Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以更改emacs';regexp语法?_Regex_Emacs_Syntax_Advising Functions - Fatal编程技术网

是否可以更改emacs';regexp语法?

是否可以更改emacs';regexp语法?,regex,emacs,syntax,advising-functions,Regex,Emacs,Syntax,Advising Functions,我喜欢emacs。我喜欢正则表达式。我讨厌emacs的正则表达式语法——需要避开分组参数和大括号,不能避开文字参数,缺少预定义的字符类,等等 我是否可以替换emacs的正则表达式引擎,或者调整一些设置,以便在使用queryreplace regexp(或许多其他功能之一)时,可以使用java/js/perl/ruby/etc中编程时使用的语法 编辑: 主题最初是“如何更改emacs的正则表达式引擎”,它不仅会更改转义规则和添加字符类,而且(本文未提及)还会添加对各种常见扩展的支持(?…)。诸如非

我喜欢emacs。我喜欢正则表达式。我讨厌emacs的正则表达式语法——需要避开分组参数和大括号,不能避开文字参数,缺少预定义的字符类,等等

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

编辑: 主题最初是“如何更改emacs的正则表达式引擎”,它不仅会更改转义规则和添加字符类,而且(本文未提及)还会添加对各种常见扩展的支持(?…)。诸如非捕获参数:(?:…)、仅当/如果不后跟:(?=…)/(?!…)时匹配以及其他功能。我不相信(尽管很高兴得到纠正)这些在emacs当前的正则表达式引擎中是可能的,并且没有任何语法替换可以解决这一问题

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

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

我想到了改变引擎以支持公共语法和扩展,建议正则表达式函数将emacs内部代码转换为公共语法,建议交互函数将我的公共语法转换为emacs语法(以便可以将其转换回公共)。。。但我认为,在这之前,就连RMS都会推荐使用叉子


您可以定义自己的elisp函数,该函数修改了regexp,然后将其传递回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)

如果使用Python正则表达式进行增量搜索/替换、替换和查询替换就足够了,那么这是一个不错的选择

VisualRegExp是VisualRegExp的一个扩展,它支持使用现代regexp引擎(不再使用转义组括号和其他好东西!)。。。目前,Python和pcre2el是开箱即用的(在Linux和Windows上测试)

它默认为

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

one = 1
two = 2
three = 3
four = 4
您可以像这样交换数字和字符串:

它可以很容易地通过安装。我的.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)

但很明显,您可以根据需要进行更改,并覆盖内置的键映射,以便在需要时进行搜索和替换。

最严格的解释是——当然,emacs是开源的。但从实际的角度来看,我不知道。这个主题有点误导。您确实不想更改正则表达式引擎(NFA或DFA),只想更改必须键入的语法。这是一件完全不同的事情。相关线程:PERL和Emacs的regexp语法比较-您能在示例中给出修改regexp变量的一两行代码吗?或者,如果你真的写了这个函数,以某种方式共享它?