我在正则表达式上有问题,我需要搜索并删除匹配正则表达式的模式,当发现我需要剪裁时。我写了一个这样的正则表达式
regex='(.*)((aa[[:space:]]bb)|(awd)|(bab)|(bc[[:space:]]d))(*.)'其中我定义了所有的开始(1),其中的部分可以是目标(2)和所有的结束(3)。简单的正则表达式(.)(abc)(.)很容易实现。string="abc";regex='(.)(abc)(.)‘
[[ $string =~ $regex) && myvar=${BASH_REMATCH[2]} && buffer=${BASH_REMATCH[1]}${BASH_REMATCH[3]}当我用嵌套的父类和OR组定义正则表达式时,麻烦就开始了,就像这里发布的第一个正则表达式。这是我的外壳中的一个示例:
$ 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_REMATCH3}中找到输入字符串的其他部分,尽管它位于正则表达式的第三个父类中。嵌套的父母怎么样了?
发布于 2015-12-05 21:53:35
bash根据开始括号从左到右的顺序为捕获组分配数字。基本上,这是深度优先的排序,而不是广度优先,就像你假设的那样。
1. (.*)
2. (
3. (hello[[:space:]]world)|
4. (example)|
5. (funk[[:space:]]you)|
6. (bar[[:space:]]baz)
)
7. (.*)在这个正则表达式中,组2本质上是组3、4、5或6的任何一个实际匹配的副本,因为第2组不包含任何其他内容。第七组是你认为的第三个括号组。
组0是整个匹配,这说明了使用@的最后一行
$ [[ $string =~ $regex ]] && echo ${BASH_REMATCH[@]}
foo bar baz bac foo bar baz bar baz bac
| | | | | | | | | |
+-------------+ +-+ +-----+ +-----+ +-+
0 1 2 6 7(在分字过程中,空组3、4和5作为空格被吞没。)
https://stackoverflow.com/questions/34111281
复制相似问题