我试图使用以下正则表达式在BAR_BAR中捕获FOO_FOO_FOO_BAR_BAR:(?:.*?_){3}(.*)。
正则表达式在使用验证器(如RegExr或regex101 )时工作,但Bash在运行时不返回任何内容:
text="FOO_FOO_FOO_BAR_BAR"
regex="(?:.*?_){3}(.*)"
[[ $text =~ $regex ]] && echo "${BASH_REMATCH[1]}"当我运行下面的示例regex时,它完美地工作(返回b):
text="abcdef"
regex="(b)(.)(d)e"
[[ $text =~ $regex ]] && echo "${BASH_REMATCH[1]}"我刚开始在巴什使用regex,我在这里少了什么?
发布于 2021-03-31 20:11:13
POSIX正则表达式不支持非捕获组和延迟量词。Bash使用POSIX,所以您可以使用
text="FOO_FOO_FOO_BAR_BAR"
regex="([^_]*_){3}(.*)"
[[ $text =~ $regex ]] && echo "${BASH_REMATCH[2]}"
# => BAR_BAR这里,
([^_]*_){3} -匹配除_以外的任何零或多个字符的三次出现(第1组),后面跟着一个_ char(.*) --字符串的其余部分(第2组)。在这种情况下,捕获组用于在开始时为分组构造提供服务,"${BASH_REMATCH[2]}"保存所需的值。
https://stackoverflow.com/questions/66894638
复制相似问题