【已解决】Emacs 如何使用正则预查?

在emacs中,如何使用正则的预查功能,比如在org中搜索标题(以‘* ’为前缀);在其他地方可以用(?=\*\s+)\w+搜索,但是在emacs里面好像不支持。

Lookaround:
    Positive Lookahead \(?=...\)
    Negative Lookahead \(?!...\)
    Positive Lookbehind \(?<=...\)
    Negative Lookbehind \(?<!...\)
1 个赞

第一次听说这个概念,估计 Emacs 是不支持的。但是感觉也不是必不可少的:你想要用这个实现某个功能,不用它也能实现。

Elisp 不支持零宽断言 (positive/negative lookahead/lookbehind zero-width assertion)。真要匹配的话,正向的 (?=?<=) 用分组也能实现一样的功能,负向的 (?!?<!) 的稍微麻烦点,但是可以通过 re-search-forwrod/backward 结合 looking-atlooking-back 实现,或者想办法改写正则表达式。

如果简单的查找,不用也罢;我正在写一个DSL的Major mode,必须用这个。

好的,我再试试。我正在写一个DSL的Major mode,必须用这个。

如果写 major-mode 的话,在添加 font-lock 的 keywords 的时候可以指定分组的编号,这种情况下正向的零宽断言就基本不太需要了吧。负向的只能用分组加 [^ ] 改写,有点麻烦。

我的DSL里面,到处都是类似org outline的东西,如:

*** xxx

** xxx

所以才想使用正则断言

如果只是这种情况的话:直接分组就行,然后 font-lock 指定对应的分组号即可。

就是要修改autocad的菜单文件。 和org类似,不过***是一级,**是二级,没有真正的关键字,想不好怎么分组。

把星号后面的当做单独一个分组就行啊。比如你写的正则 (?=\*\s+)\w+ 改成 \*\s+\(\w+\),星号后面的是 group 1,指定 font-lock keywords 的时候用1取第一个分组就行。

我写过简单的一个 major-mode,你可以看看其中指定 font-lock keywords 的那部分代码,很简单。

好的,谢谢。没想过可以这样干。