使用 BASH_REMATCH 的 Bash 正则表达式未捕获所有组

问题描述 投票:0回答:1

在 bash 中,我试图用这个正则表达式捕获这些组,但 BASH_REMATCH 给我空结果

RESULT="1730624402|1*;[64452034;STOP;1730588408;74;22468;1"
regex="([[:digit:]]+)?|([[:digit:]])*;\[([[:digit:]]+)?;STOP;([[:digit:]]+)?;"

if [[ "$RESULT" =~ $regex ]]
    then
        echo "${BASH_REMATCH}"     # => 1730624402
        echo "${BASH_REMATCH[1]}"  # => 1730624402
        echo "${BASH_REMATCH[2]}"  # EMPTY
        echo "${BASH_REMATCH[3]}"  # EMPTY
        echo "${BASH_REMATCH[4]}"  # EMPTY
    else
        echo "check regex"
    fi

我哪里出错了?

提前致谢

regex bash regex-group
1个回答
0
投票

RESULT
包含文字字符
|
*
。 这两个字符在正则表达式中具有特殊含义,因此需要对其进行转义。

对OP的一项修改

regex

regex="([[:digit:]]+)\|([[:digit:]])\*;\[([[:digit:]]+)?;STOP;([[:digit:]]+);"

试驾:

[[ "$RESULT" =~ $regex ]] && typeset -p BASH_REMATCH
declare -a BASH_REMATCH=([0]="1730624402|1*;[64452034;STOP;1730588408;" [1]="1730624402" [2]="1" [3]="64452034" [4]="1730588408")

注意: OP(还)没有说明

BASH_REMATCH[]
所需的内容,所以此时我猜测这是正确的

© www.soinside.com 2019 - 2024. All rights reserved.