求教emacs里面的regex

之前在改imenu的regex的时候我就没搞太明白,也没找到比较清楚的帖子。

现在看到doom-emacs里面写了一个匹配自动开启rjsx-mode的regex。

       (re-search-forward "\\(^\\s-*import React\\|\\( from \\|require(\\)[\"']react\\)"
                          magic-mode-regexp-match-limit t)

链接在这儿:doomemacs/config.el at master · doomemacs/doomemacs · GitHub

请教下大家是什么意思?有没有什么讲regex比较清楚的帖子?

我觉得能看懂 PCRE 这个就没问题,因为 Emacs 正则是 PCRE 的子集。

这个case搞懂了,主要是

\( \) start/end of group

\s- whitespace character

RegExp 本来读就比写难,再加上 Emacs Lisp 中正则表达式没有专门的语法,用字符串表示时需要再「转义」一次,这跟 RegExp 的「转义」规则不同。

rx 可能会好一些

(rx line-start (* (syntax whitespace)) "import React" (or " from " "require(") (in "\"'") "react")

你举的例子可能就有瑕疵——最外层的分组没有必要。

假如 Emacs Lisp 有个 RegExp Parser,或许能帮助我们「读」RegExp,比如

(regexp-to-rx "^foo\\|bar$")

=>

(rx line-start (or "foo" "bar") line-end)
3 个赞

emacs的regex哪里要加\哪里不加和主流的perl/php/js的风格不一样,所以用起来我都是各种尝试。就记住了一个\( \),因为query-replace-regexp要用(是这个函数吧?我用的evil的替换)。

所以还是推荐 rx