为什么代码会产生相同的结果?
(setq line "@c *##**@w{@ref{ФайлыКаталоги,, ФайлыКаталоги}}**##*") (string-match "*##**" line) ;(eval-last-sexp) => 3 (string-match "**##*" line) ;(eval-last-sexp) => 3
bvuwiixz1#
除了你所发现的,注意你的每个正则表达式中的第一个星号(*)是而不是一个特殊的正则表达式字符。所以你不需要转义它,以匹配一个星号。Elisp手册,节点Regexp Special,这样说:
*
例如,*foo将*视为普通的,因为没有*可以作用于其上的前面的表达式。依赖于此行为是不良的实践;无论特殊字符出现在何处,都要将其引起来。所以,是的,逃避它是可以的,但是要注意,第一个*永远不会特别地行动,即使你没有逃避它,为了特别地行动,*必须遵循一些东西。
*foo
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
2条答案
按热度按时间bvuwiixz1#
除了你所发现的,注意你的每个正则表达式中的第一个星号(
*
)是而不是一个特殊的正则表达式字符。所以你不需要转义它,以匹配一个星号。Elisp手册,节点Regexp Special,这样说:例如,
*foo
将*
视为普通的,因为没有*
可以作用于其上的前面的表达式。依赖于此行为是不良的实践;无论特殊字符出现在何处,都要将其引起来。所以,是的,逃避它是可以的,但是要注意,第一个
*
永远不会特别地行动,即使你没有逃避它,为了特别地行动,*
必须遵循一些东西。njthzxwz2#
解决方案是使用星号屏蔽
你可以听德鲁的建议