为什么代码会产生同样的结果?
(setq line "@c *##**@w{@ref{ФайлыКаталоги,, ФайлыКаталоги}}**##*")
(string-match "*##**" line) ;(eval-last-sexp) => 3
(string-match "**##*" line) ;(eval-last-sexp) => 3
除了你发现的,还要注意第一个星号(*
)中的每一个regexps都是 不 一个特殊的regexp字符。 所以你不需要转义,就可以按字面意思匹配星号。Elisp手册中,节点 Regexpress特殊,说的就是这个。
请注意: 为了历史的兼容性,如果特殊字符在上下文中的特殊含义是没有意义的,那么它们将被视为普通字符。
例如:
*foo
犒劳*
由于没有前面的表达方式,因此被认为是普通的。*
可以行动。 依靠这种行为是很差劲的做法,反正引用特殊字符,不管它出现在哪里。
所以,是的,逃避它是可以的,但要注意的是,第一个 *
即使你不逃避,也不会特别行动。要特别行动。*
必须遵循什么。
解决的办法是使用星号屏蔽。
(setq line "@c *##**@w{@ref{ФайлыКаталоги,, ФайлыКаталоги}}**##*")
(string-match "\\*##\\*\\*" line) ;(eval-last-sexp) => 3
(string-match "\\*\\*##\\*" line) ;(eval-last-sexp) => 47