因此,使用正则表达式生成器(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]”,其他名称也是如此。
或者要包含上述rx
vs 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))))