首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bash_rematch和regex (带有嵌套父母)

bash_rematch和regex (带有嵌套父母)
EN

Stack Overflow用户
提问于 2015-12-05 21:45:24
回答 1查看 2K关注 0票数 3

我在正则表达式上有问题,我需要搜索并删除匹配正则表达式的模式,当发现我需要剪裁时。我写了一个这样的正则表达式

代码语言:javascript
复制
regex='(.*)((aa[[:space:]]bb)|(awd)|(bab)|(bc[[:space:]]d))(*.)'

其中我定义了所有的开始(1),其中的部分可以是目标(2)和所有的结束(3)。简单的正则表达式(.)(abc)(.)很容易实现。string="abc";regex='(.)(abc)(.)‘

代码语言:javascript
复制
[[ $string =~ $regex) && myvar=${BASH_REMATCH[2]} && buffer=${BASH_REMATCH[1]}${BASH_REMATCH[3]}

当我用嵌套的父类和OR组定义正则表达式时,麻烦就开始了,就像这里发布的第一个正则表达式。这是我的外壳中的一个示例:

代码语言:javascript
复制
$ 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}中找到输入字符串的其他部分,尽管它位于正则表达式的第三个父类中。嵌套的父母怎么样了?

EN

回答 1

Stack Overflow用户

发布于 2015-12-05 21:53:35

bash根据开始括号从左到右的顺序为捕获组分配数字。基本上,这是深度优先的排序,而不是广度优先,就像你假设的那样。

代码语言:javascript
复制
1. (.*)
2. (
3.   (hello[[:space:]]world)|
4.   (example)|
5.   (funk[[:space:]]you)|
6.   (bar[[:space:]]baz)
   )
7. (.*)

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

组0是整个匹配,这说明了使用@的最后一行

代码语言:javascript
复制
$ [[ $string =~ $regex ]] && echo ${BASH_REMATCH[@]}
foo bar baz bac foo bar baz bar baz bac
|             | | | |     | |     | | |
+-------------+ +-+ +-----+ +-----+ +-+
       0         1     2       6     7

(在分字过程中,空组3、4和5作为空格被吞没。)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34111281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档