在emacs中,如何使用正则的预查功能,比如在org中搜索标题(以‘* ’为前缀);在其他地方可以用(?=\*\s+)\w+搜索,但是在emacs里面好像不支持。
Lookaround:
Positive Lookahead \(?=...\)
Negative Lookahead \(?!...\)
Positive Lookbehind \(?<=...\)
Negative Lookbehind \(?<!...\)
在emacs中,如何使用正则的预查功能,比如在org中搜索标题(以‘* ’为前缀);在其他地方可以用(?=\*\s+)\w+搜索,但是在emacs里面好像不支持。
Lookaround:
Positive Lookahead \(?=...\)
Negative Lookahead \(?!...\)
Positive Lookbehind \(?<=...\)
Negative Lookbehind \(?<!...\)
第一次听说这个概念,估计 Emacs 是不支持的。但是感觉也不是必不可少的:你想要用这个实现某个功能,不用它也能实现。
Elisp 不支持零宽断言 (positive/negative lookahead/lookbehind zero-width assertion)。真要匹配的话,正向的 (?=
和 ?<=
) 用分组也能实现一样的功能,负向的 (?!
和 ?<!
) 的稍微麻烦点,但是可以通过 re-search-forwrod/backward
结合 looking-at
和 looking-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 的那部分代码,很简单。
好的,谢谢。没想过可以这样干。