HappyFace Asked: 2018-10-15 20:49:31 +0800 CST2018-10-15 20:49:31 +0800 CST 2018-10-15 20:49:31 +0800 CST zsh 中的非贪婪(扩展)glob 772 我喜欢做非贪婪的 glob,但我的谷歌搜索暗示这不受支持。是这样吗?如果是这样,为什么会这样? 例如,我想在历史扩展中使用非贪婪的 glob,例如^ff* ^open打开以前 ffplayed 的 mp3。 zsh wildcards 1 个回答 Voted Best Answer Gilles 'SO- stop being evil' 2018-10-19T23:17:25+08:002018-10-19T23:17:25+08:00 Zsh 没有非贪婪通配符。我能想到它进行非贪婪匹配的唯一地方是使用参数替换形式${VAR#PATTERN}和${VAR%PATTERN}(而不是${VAR##PATTERN}贪婪匹配)去除前缀时${VAR%%PATTERN}。 总是可以将使用非贪婪通配符的模式转换为不使用它们的模式,但是转换可能会很痛苦,并且在最坏的情况下,结果的大小与原始大小成指数关系。非贪婪匹配方便的一个经典示例是,当您想匹配一个数字范围后跟其他内容时,例如<1-42>*:这匹配43a,因为<1-42>匹配4;一种解决方法是<1-42>([^0-9]*)#. 根据您想要做什么,其他方法可能更容易,例如安排使用前缀或后缀替换,或者从不同的角度解决问题。 对于您想要更改命令的历史扩展的用例,有一种不同的方法,它比您的示例短一个字符,并且在您的特定示例中更可靠。而不是在命令行上的任何地方^ff* ^open匹配ff并且仅在参数不包含空格时才有效,您可以使用 open !ff:* 仅ff在命令行开头匹配(!?ff将匹配任何地方)。
Zsh 没有非贪婪通配符。我能想到它进行非贪婪匹配的唯一地方是使用参数替换形式
${VAR#PATTERN}
和${VAR%PATTERN}
(而不是${VAR##PATTERN}
贪婪匹配)去除前缀时${VAR%%PATTERN}
。总是可以将使用非贪婪通配符的模式转换为不使用它们的模式,但是转换可能会很痛苦,并且在最坏的情况下,结果的大小与原始大小成指数关系。非贪婪匹配方便的一个经典示例是,当您想匹配一个数字范围后跟其他内容时,例如
<1-42>*
:这匹配43a
,因为<1-42>
匹配4
;一种解决方法是<1-42>([^0-9]*)#
. 根据您想要做什么,其他方法可能更容易,例如安排使用前缀或后缀替换,或者从不同的角度解决问题。对于您想要更改命令的历史扩展的用例,有一种不同的方法,它比您的示例短一个字符,并且在您的特定示例中更可靠。而不是在命令行上的任何地方
^ff* ^open
匹配ff
并且仅在参数不包含空格时才有效,您可以使用仅
ff
在命令行开头匹配(!?ff
将匹配任何地方)。