为什么用正则表达式生成器创建的正则表达式使用的语法与交互式正则表达式不同?


26

因此,使用正则表达式生成器(Mx重新生成器),找到以\结尾的行将使用“ \\ $”,而在用正则表达式进行搜索和替换时,仅需使用“ \ $”。我本来希望正则表达式生成器能够构建直接可用的表达式,那么,造成这种差异的原因是什么?


6
它构建可直接在代码中使用的表达式。
2014年

1
@ abo-abo这就是我一直在寻找的答案,但我没有意识到在代码中使用的内容与在ui中使用的内容之间存在区别。重建者使用代码语法似乎很不直观,而手册没有说,但这解释了区别。
user2699 2014年

2
为了使正则表达式构建器对于组成交互式搜索更加有用,请查看ReBuilder emacs Wiki页面,尤其是reb-query-replace函数定义。
dfeich 2014年

Answers:


29

实际上有四个不同的re-builder语法选项,您可以使用C-cTAB

二是对SEXP形式的正则表达式的编译器rxsregex(但不如前者更全面,几乎完全语法兼容,你真的可以忽略sregex除非你有旧代码,用它来工作)。

其他两个语法选项是read(默认)和string(这是您交互使用的语法)。

read语法是“代码”语法-即由口齿不清的读者所认可-在其中输入正则表达式按照该字符串读语法

C-hig (elisp) Syntax for Strings RET

string语法(我已经在这方面一直认为是不必要的混乱名)是正则表达式字符串的语法已经被读出时,并因此没有任何字符转义需要的字符串。也就是说,这是实际的正则表达式语法,与Emacs交互提示时使用的语法相同。

如果您想默认使用字符串语法,请将以下内容添加到您的init文件中,或使用 M-x customize-option RET reb-re-syntax RET

(setq reb-re-syntax 'string)

请注意,在编辑正则表达式时,可以在读取和字符串语法之间来回切换,而不会丢失数据。您也可以 sexp形式切换为读取/字符串语法(自然;将sexps编译为字符串是这些库的用途),但是您不能朝另一个方向从字符串生成sexp。重建器记住了sexp是什么,因此您在更改语法时不会丢失该形式;但是如果您使用其他语法修改regexp然后又将其改回,它也不会得到更新。简而言之,如果要将正则表达式构建为sexp,请确保在使用该语法时对其进行编辑


rx支持的陷阱在于它实际上是在使用rx-to-string函数,这与rx在代码中使用宏并不完全相同。 rx接受任意数量的形式参数并将其视为隐含序列,而rx-to-string仅接受单个形式,并且任何顶级序列都必须使用'(sequence ...)或等效形式显式表示。

总之,当你进入一个表格'(...)中重新生成器,它被处理成(rx-to-string '(...))(rx ...)

还要注意re-builder,即使表单再次生效,无效的表单也可能会导致停止动态更新关联缓冲区中的匹配项。的C-cC-u绑定对于reb-force-update解决这些情况很有用。


默认情况下,模式行显示“RE生成器”使用时readstring语法,及“重生成器Lisp的”当使用rxsregex语法,但它似乎更为有用来识别特定的使用语法(特别是区分readstring)。

如果delight从GNU ELPA 安装软件包,则可以使用以下命令向模式行添加语法指示符。

(let ((name '("Regexp[" (:eval (symbol-name reb-re-syntax)) "]")))
  (delight `((reb-mode ,name :major)
             (reb-lisp-mode ,name :major))))

这会将模式名称在read语法上更改为“ Regexp [read]”,其他名称也是如此。

或者要包含上述rxvs rx-to-string陷阱的提示,请在使用rx语法时使模式行显示为“ Regexp [rx-to-string]” :

(let ((name '("Regexp["
              (:eval (symbol-name (if (eq reb-re-syntax 'rx)
                                      'rx-to-string
                                    reb-re-syntax)))
              "]")))
  (delight `((reb-mode ,name :major)
             (reb-lisp-mode ,name :major))))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.