我有一个以下格式的字符串需要匹配
./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
也许我只需要运行两种模式匹配,其中一种只有一个捕获组。作为解决方法。