因此,使用正则表达式生成器(Mx重新生成器),找到以\结尾的行将使用“ \\ $”,而在用正则表达式进行搜索和替换时,仅需使用“ \ $”。我本来希望正则表达式生成器能够构建直接可用的表达式,那么,造成这种差异的原因是什么?
reb-query-replace函数定义。
因此,使用正则表达式生成器(Mx重新生成器),找到以\结尾的行将使用“ \\ $”,而在用正则表达式进行搜索和替换时,仅需使用“ \ $”。我本来希望正则表达式生成器能够构建直接可用的表达式,那么,造成这种差异的原因是什么?
reb-query-replace函数定义。
Answers:
实际上有四个不同的re-builder语法选项,您可以使用C-cTAB
二是对SEXP形式的正则表达式的编译器rx和sregex(但不如前者更全面,几乎完全语法兼容,你真的可以忽略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生成器”使用时read或string语法,及“重生成器Lisp的”当使用rx或sregex语法,但它似乎更为有用来识别特定的使用语法(特别是区分read和string)。
如果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))))