gpt4 book ai didi

regex - bash_rematch 和正则表达式(带有嵌套的括号)

转载 作者:行者123 更新时间:2023-12-04 13:46:29 24 4
gpt4 key购买 nike

我在使用正则表达式时遇到问题,我需要搜索并删除与正则表达式匹配的模式,当找到时我需要修剪掉。我写了一个这样的正则表达式

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]} 中找到输入字符串的其他部分,尽管它位于正则表达式的第三个括号中。嵌套的括号会发生什么?

最佳答案

bash 根据左括号从左到右的顺序将数字分配给捕获组。基本上,这是深度优先排序,而不是您假设的广度优先。

1. (.*)
2. (
3. (hello[[:space:]]world)|
4. (example)|
5. (funk[[:space:]]you)|
6. (bar[[:space:]]baz)
)
7. (.*)

在这个正则表达式中,第 2 组本质上是第 3、4、5 或 6 组实际匹配的副本,因为第 2 组不包含任何其他内容。第 7 组就是您认为的第 3 个括号组。

第 0 组是整个匹配项,它使用 @ 解释你的最后一行:

$ [[ $string =~ $regex ]] && echo ${BASH_REMATCH[@]}
foo bar baz bac foo bar baz bar baz bac
| | | | | | | | | |
+-------------+ +-+ +-----+ +-----+ +-+
0 1 2 6 7

(空组 3、4 和 5 在分词过程中被吞没为空白。)

关于regex - bash_rematch 和正则表达式(带有嵌套的括号),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34111281/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com