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

vsdwdz23  于 2022-12-27  发布在  Mac
关注(0)|答案(2)|浏览(149)

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

(setq line "@c *##**@w{@ref{ФайлыКаталоги,, ФайлыКаталоги}}**##*")
(string-match "*##**" line) ;(eval-last-sexp) => 3
(string-match "**##*" line) ;(eval-last-sexp) => 3
bvuwiixz

bvuwiixz1#

除了你所发现的,注意你的每个正则表达式中的第一个星号(*)是而不是一个特殊的正则表达式字符。所以你不需要转义它,以匹配一个星号。Elisp手册,节点Regexp Special,这样说:

  • 请注意:* 为确保历史兼容性,特殊字符在其特殊含义没有意义的上下文中将被视为普通字符。

例如,*foo*视为普通的,因为没有*可以作用于其上的前面的表达式。依赖于此行为是不良的实践;无论特殊字符出现在何处,都要将其引起来。
所以,是的,逃避它是可以的,但是要注意,第一个*永远不会特别地行动,即使你没有逃避它,为了特别地行动,*必须遵循一些东西。

njthzxwz

njthzxwz2#

解决方案是使用星号屏蔽

(setq line "@c *##**@w{@ref{ФайлыКаталоги,, ФайлыКаталоги}}**##*")
(string-match "\\*##\\*\\*" line) ;(eval-last-sexp) => 3
(string-match "\\*\\*##\\*" line) ;(eval-last-sexp) => 47

你可以听德鲁的建议

(setq line "@c *##**@w{@ref{ФайлыКаталоги,, ФайлыКаталоги}}**##*")
(string-match "*##\\*\\*" line) ;(eval-last-sexp) => 3
(string-match "*\\*##\\*" line) ;(eval-last-sexp) => 47

相关问题