Emacs中的Regexp语言和替换

时间:2014-03-28 18:27:22

标签: regex emacs pcre

当我使用regexp-builder时,我需要以与使用replace-regexp时的方式不同的方式逃避事情。现在,this thread解释说这两个命令使用不同的语法,但为什么呢?

另外,我浏览了这篇博文:Re-builder: The Interactive Regexp Builder,我添加了

(require 're-builder) 
(setq reb-re-syntax 'string)
按照网站上的建议

到我的.emacs文件。但是,我仍然需要在正则表达式周围键入"才能使其正常工作。我认为改变语法语言可以解决这个问题,但事实并非如此。

有了这个,我的实际问题是:

  1. 是不是Emacs不支持PCRE?这有什么变通方法吗?
  2. regex-builder中获得正确的正则表达式后,有没有办法直接将正则表达式发送到replace-regexp并输入替换字符串?

3 个答案:

答案 0 :(得分:2)

关于问题#2:否(至少不是默认情况下),但是在没有使用重建器的情况下还有另一种方法。

  • 首先为您的模式执行regexp isearch。因为它是一个isearch,你会以交互方式看到匹配,有点像重建(尽管没有彩色分组)。

  • 仍然在isearch中,一旦您对该模式感到满意,请输入 CM - %来调用isearch-query-replace-regexp,这将提示您进行替换。

你当然可以简单地从你的缓冲区中复制你的重建字符串并将其作为替换字符串(但这无疑不是新闻)。

我很想知道在使用字符串语法重新构建时需要引号。它似乎只是系统的形式,reb-read-regexp在使用该语法时返回第一个和最后一个"之间的所有内容。也许它的目的是确保前导空格或尾随空格不会混淆重要事项 - 重新构建器确实使用前导空格来提高可见性,并且尾随空格更难以发现。或者它可能只是使一些代码更方便/一致。

答案 1 :(得分:2)

MELPA存储库中有一个名为pcre2el的软件包,它为Emacs的许多部分添加了PCRE支持,包括regexp-builderreplace-regexp

答案 2 :(得分:1)

  1. 不,Emacs不支持PCRE,据我所知,没有解决办法。
  2. 我不这么认为。
  3. 要回答您的第一个问题,为什么重构器使用与replace-regexp不同的语法:

    默认情况下,re-builder使用适合编写elisp程序的语法。在书面程序的上下文中,regexps在字符串中输入。在字符串内部,反斜杠具有特殊含义,与使用反斜杠作为正则表达式的一部分相冲突。因此,在字符串中,您需要双重反斜杠,以使用它来表示部分正则表达式语法。

    另一方面,

    replace-regexp旨在由用户以交互方式使用,并明确要求输入为regexp。为方便起见,它将反斜杠解释为regexp语法,而不是字符串转义。这就是为什么你可以在这种情况下使用单反斜杠。