emacs: 使用(string-match)寻找字符串中的子串。

问题描述 投票:1回答:2

为什么代码会产生同样的结果?

(setq line "@c *##**@w{@ref{ФайлыКаталоги,, ФайлыКаталоги}}**##*")
(string-match "*##**" line) ;(eval-last-sexp) => 3
(string-match "**##*" line) ;(eval-last-sexp) => 3
regex emacs
2个回答
2
投票

除了你发现的,还要注意第一个星号(*)中的每一个regexps都是 一个特殊的regexp字符。 所以你不需要转义,就可以按字面意思匹配星号。Elisp手册中,节点 Regexpress特殊,说的就是这个。

请注意: 为了历史的兼容性,如果特殊字符在上下文中的特殊含义是没有意义的,那么它们将被视为普通字符。

例如: *foo 犒劳 * 由于没有前面的表达方式,因此被认为是普通的。* 可以行动。 依靠这种行为是很差劲的做法,反正引用特殊字符,不管它出现在哪里。

所以,是的,逃避它是可以的,但要注意的是,第一个 * 即使你不逃避,也不会特别行动。要特别行动。* 必须遵循什么。


0
投票

解决的办法是使用星号屏蔽。

(setq line "@c *##**@w{@ref{ФайлыКаталоги,, ФайлыКаталоги}}**##*")
(string-match "\\*##\\*\\*" line) ;(eval-last-sexp) => 3
(string-match "\\*\\*##\\*" line) ;(eval-last-sexp) => 47
© www.soinside.com 2019 - 2024. All rights reserved.