如何在 zsh 中使用正则表达式变量?

ram*_*ram 3 regex bash posix zsh

如何在 zsh 中使用正则表达式变量,就像在 bash 中一样?我只能让 zsh 使用内联正则表达式。我只是想测试一个只包含字母数字、下划线或句点的字符串,但不包含破折号。正如您所看到的,内联正则表达式和正则表达式变量在 bash 中按预期工作,但 zsh 只匹配内联正则表达式。

\n

重击

\n
#!/bin/bash\n\nRE='[0-9A-Za-z_\\.]'\n\nfor test in $@; do\n    echo -e "bash test: $test"\n\n    if [[ "${test//[0-9A-Za-z_\\.]/}" = "" ]]; then\n        echo -e '\\tmatch inline'\n    fi\n\n    if [[ "${test//$RE/}" = "" ]]; then\n        echo -e '\\tmatch var'\n    fi\n\ndone\n\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x9d\xaf./bash-regex-test.sh foo_bar foo-bar

\n

输出:

\n
\nbash test: foo_bar\n        match inline\n        match var\nbash test: foo-bar\n\n
Run Code Online (Sandbox Code Playgroud)\n

兹什

\n
#!/bin/zsh\n\n\nRE='[0-9A-Za-z_\\.]'\n\nfor test in $@; do\n    echo "zsh test: $test"\n\n    if [[ "${test//[0-9A-Za-z_\\.]/}" = "" ]]; then\n        echo '\\tmatch inline'\n    fi\n\n    if [[ "${test//$RE/}" = "" ]]; then\n        echo '\\tmatch var'\n    fi\n\ndone\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x9d\xaf./zsh-regex-test.zsh foo_bar foo-bar

\n

输出:

\n
zsh test: foo_bar\n        match inline\nzsh test: foo-bar\n\n
Run Code Online (Sandbox Code Playgroud)\n

tsh*_*ono 14

您需要zsh使用${~RE}而不是$RE变量$RE 被视为模式,而不是文字字符串。然后将该行更改为:

    if [[ "${test//${~RE}/}" = "" ]]; then
Run Code Online (Sandbox Code Playgroud)

顺便说一句,您使用的$RE不是正则表达式,而是路径名扩展中的模式
为了将其用作正则表达式,您需要使用=~运算符:

#!/bin/zsh

RE='^[0-9A-Za-z_\.]+$'

for test in "$@"; do
    echo "zsh test: $test"

    if [[ $test =~ ^[0-9A-Za-z_\.]+$ ]]; then
        echo '\tmatch inline'
    fi

    if [[ $test =~ $RE ]]; then
        echo '\tmatch var'
    fi

done
Run Code Online (Sandbox Code Playgroud)

  • `${~sub}` 替换在 `zsh` 文档的“扩展”> 14.3“参数扩展 >“${name/pattern/repl}”部分中进行了介绍。请参阅:https://zsh.sourceforge.io /Doc/Release/Expansion.html (2认同)