我喜欢做非贪婪的通配符,但我的谷歌搜索暗示这不受支持。是这样吗?如果是这样,为什么会这样呢?
例如,我想在历史扩展中使用非贪婪的 glob,例如^ff* ^open
打开以前播放过的 mp3。
答案1
Zsh 没有非贪婪通配符。我能想到的唯一进行非贪婪匹配的地方是用参数替换形式${VAR#PATTERN}
and剥离前缀时${VAR%PATTERN}
(与贪婪匹配的${VAR##PATTERN}
and相对)。${VAR%%PATTERN}
总是可以将使用非贪婪通配符的模式转换为不使用它们的模式,但转换可能会很痛苦,并且在最坏的情况下,结果的大小是原始大小的指数级。一个典型的非贪婪匹配会很方便的例子是,当您想要匹配一个数字范围后跟其他内容时,例如<1-42>*
: this matches 43a
because <1-42>
matches 4
;解决方法是<1-42>([^0-9]*)#
。根据您想要执行的操作,其他方法可能会更容易,例如安排使用前缀或后缀替换,或者从不同的角度解决问题。
对于您想要更改命令的历史扩展的用例,有一种不同的方法,它比您的示例短一个字符,并且在您的特定示例中更可靠。您可以使用而不是^ff* ^open
匹配ff
命令行上的任何位置并且仅在参数不包含空格时才有效
open !ff:*
它只匹配ff
命令行的开头(!?ff
将匹配任何地方)。