首页 > 解决方案 > $BASH_REMATCH[] 的 zsh 等价物是什么?

问题描述

zshfor中的等价物是什么$BASH_REMATCH,它是如何使用的?

标签: zsh

解决方案


要使zsh行为与 相同bash,请使用:

setopt BASH_REMATCH

或者在一个函数中考虑:

setopt local_options BASH_REMATCH

(这只会在函数范围内设置选项)

然后就像$BASH_REMATCH你在bash.


手册BASH_REMATCH

设置后,使用 =~ 运算符执行的匹配将设置 BASH_REMATCH 数组变量,而不是默认的 MATCH 和匹配变量。BASH_REMATCH 数组的第一个元素将包含整个匹配的文本,后续元素将包含提取的子字符串。当 KSH_ARRAYS 也设置时,此选项更有意义,因此整个匹配部分存储在索引 0 处,第一个子字符串位于索引 1 处。没有此选项,MATCH 变量包含整个匹配的文本,匹配数组变量包含子字符串.

然后=~会表现得像 in ,但如果你想要手册bash中描述的完整行为:

字符串 =~ 正则表达式

如果字符串与正则表达式 regexp 匹配,则为 true。如果设置了选项 RE_MATCH_PCRE regexp 使用 zsh/pcre 模块作为 PCRE 正则表达式进行测试,否则使用 zsh/regex 模块作为 POSIX 扩展正则表达式进行测试。匹配成功后,一些变量会被更新;如果匹配失败,则不会更改任何变量。

如果未设置 BASH_REMATCH 选项,则标量参数 MATCH 设置为与模式匹配的子字符串,整数参数 MBEGIN 和 MEND 分别设置为字符串中匹配项的开始和结束索引,这样如果包含字符串在变量 var 中,表达式 '${var[$MBEGIN,$MEND]}' 与 '$MATCH' 相同。遵循选项 KSH_ARRAYS 的设置。同样,数组 match 设置为匹配括号内的子表达式的子字符串,数组 mbegin 和 mend 分别设置为字符串中子字符串的开始和结束位置的索引。如果没有带括号的子表达式,则不会设置数组。例如,如果字符串 'a short string' 与正则表达式 's(...)t' 匹配,则(假设未设置选项 KSH_ARRAYS)MATCH,

如果设置了选项 BASH_REMATCH,则数组 BASH_REMATCH 设置为匹配模式的子字符串,后跟匹配模式中带括号的子表达式的子字符串。


推荐阅读