是否有简洁的 zsh 正则表达式参数扩展来替换模式的最后一个匹配?
我知道这样做很丑陋,但我更喜欢更干净、更简洁的语法:
# param, pattern & replacement are placeholders below for real values
${(*S)param/%pattern(#b)(*)/replacement${match[1]}}
它启用了extended_glob,选择最短匹配,将模式与值的末尾进行匹配$param
,指定模式,启用反向引用,将模式最后一次匹配之后的文本保存在反向引用中,然后用我的替换替换匹配,使用反向引用恢复匹配后的文本。
如果最后一次出现是指像 那样从左到右扫描后的最后一次出现
${param//pattern/replacement}
(这不是您尝试做的),您可以执行以下操作:替换第n次出现的函数(当n为负数时,可能从最后一次开始计算)可以写成:
例如这样调用:
没有明确的方式来选择最后一个匹配项。但您可以先匹配,然后
*
跟上您的模式:那么您的模式将是最后一个匹配项,因为*
它匹配的是模式后面的最长的前缀。使用b
通配符标志可以访问替换中匹配的字符串的部分。这需要
extended_glob
启用。使用 zsh ≥5.9,您可以使用*
参数扩展标志激活它。例如,以下代码片段
a1b2c3d
与模式匹配(#b)(*)([0-9])
。(#b)
导致后面的括号组记录它们在 中匹配的内容。 (如果需要,$match
位置也可以在$mbegin
和 中找到。)匹配最长的前缀,因此匹配最后一位数字。 替换保留与 匹配的前缀,用其他内容替换数字,并保留不匹配的后缀,因此代码片段输出。$mend
*
[0-9]
*
a1b2c-d
在 zsh ≥5.9 中,您不需要确保它
extended_glob
处于活动状态。