【发布时间】:2026-02-04 07:55:01
【问题描述】:
我在使用正则表达式时遇到问题,我需要搜索并删除与正则表达式匹配的模式,当发现我需要修剪时。我写了一个这样的正则表达式
regex='(.*)((aa[[:space:]]bb)|(awd)|(bab)|(bc[[:space:]]d))(*.)'
我定义了所有的开头(1),可以是目标的部分(2)和所有的结尾(3)。 使用像 (.)(abc)(.) 这样的简单正则表达式很容易 字符串="abc";正则表达式='(.)(abc)(.)'
[[ $string =~ $regex) && myvar=${BASH_REMATCH[2]} && buffer=${BASH_REMATCH[1]}${BASH_REMATCH[3]}
当我用嵌套的括号和 OR 组定义正则表达式时,问题就开始了,就像这里发布的第一个正则表达式一样。 这是我的 shell 中的一个示例:
$ string=" foo bar baz bac"
$ regex='(.*)((hello[[:space:]]world)|(example)|(funk[[:space:]]you)|(bar[[:space:]]baz))(.*)'
$ [[ $string =~ $regex ]] && echo ${BASH_REMATCH[1]}
foo
$ [[ $string =~ $regex ]] && echo ${BASH_REMATCH[2]}
bar baz
$ [[ $string =~ $regex ]] && echo ${BASH_REMATCH[3]}
$ [[ $string =~ $regex ]] && echo ${BASH_REMATCH[4]}
$ [[ $string =~ $regex ]] && echo ${BASH_REMATCH[5]}
$ [[ $string =~ $regex ]] && echo ${BASH_REMATCH[6]}
bar baz
$ [[ $string =~ $regex ]] && echo ${BASH_REMATCH[7]}
bac
$ [[ $string =~ $regex ]] && echo ${BASH_REMATCH[@]}
foo bar baz bac foo bar baz bar baz bac
匹配有一个奇怪的行为,我没有在 ${BASH_REMATCH[3]} 中找到输入字符串的其他部分,尽管它位于正则表达式的第三个括号中。 嵌套括号会发生什么?
【问题讨论】: