繁体   English   中英

bash_rematch和regex(带有嵌套的括号)

[英]bash_rematch and regex (with nested parens)

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

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]}

当我用嵌套的parens和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

匹配具有奇怪的行为,尽管在正则表达式的第3个括号中,但我在$ {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在拆分单词时被吞噬为空白。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM