如何从正则表达式匹配中提取一个捕获组的多次出现?

如何从正则表达式匹配中提取一个捕获组的多次出现?

我有一个以下格式的字符串需要匹配

./foo/baz/bar/filename.c

我的正则表达式看起来像这样

  regex=$'^(\./)?([a-zA-Z0-9_-]+/)+([a-zA-Z0-9_-]+\.[a-z]+)$'

测试看起来像这样

[[ $search =~ $regex ]]

线程有一个有趣的代码代码示例用户示例格伦·杰克曼为了捕获同一捕获组的重复出现

global_rematch() { 
    local s=$1 regex=$2 
    while [[ $s =~ $regex ]]; do 
        echo "${BASH_REMATCH[1]}"
        s=${s#*"${BASH_REMATCH[1]}"}
    done
}
global_rematch "$mystring1" "$regex" 

但在正则表达式中,只有捕获组。我的这里的情况有点不同。

我的 $regex 尝试提取一个捕获组的多次出现。但是该捕获组被懒惰地处理(或者这里正确的术语是什么??global matching)并且它只输出它的第一次出现。其他的都被丢弃。

$ printf "%s\n" "${BASH_REMATCH[@]}"
./foo/baz/bar/filename.c
./
bar/
filename.c

只有当我添加一对额外的括号时,所有事件才会被输出,但这不是我想要的结果。

regex=$'^(\./)?(([a-zA-Z0-9_-]+/)+)([a-zA-Z0-9_-]+\.[a-z]+)$'

结果是

echo "${BASH_REMATCH[2]}"
foo/baz/bar/

BASH_REMATCH有没有办法应用上面的代码示例或其他解决方案,以便所有重复发生的情况都由自己的索引存储?

这样索引就会像这样:

echo "${BASH_REMATCH[2]}"
./foo/baz/bar/filename.c
echo "${BASH_REMATCH[1]}"
./
echo "${BASH_REMATCH[2]}"
foo/
echo "${BASH_REMATCH[3]}"
baz/
echo "${BASH_REMATCH[4]}"
bar/
echo "${BASH_REMATCH[5]}"
filename.c

也许我只需要运行两种模式匹配,其中一种只有一个捕获组。作为解决方法。

相关内容