我创建了这个正则表达式并成功测试了它
https://regex101.com/r/a7qvuw/1
然而,正则表达式在我写的这个bash代码中表现不同
# Splitting by colon
IFS=';' read -ra statements <<< $contents
# Splitting by the = sign.
regex="\s*(.*?)\s*=\s*(.*)\b"
for i in "${statements[@]}"; do
if [[ $i =~ $regex ]]; then
key=${BASH_REMATCH[1]}
params=${BASH_REMATCH[2]}
echo "KEY: $key| PARAMS: $params"
fi
done
变量$ contents具有链接中使用的文本。问题是$ key的末尾有空格,而我尝试的正则表达式匹配没有空格的单词。
我得到这样的输出:
KEY: vclock_spec | PARAMS: clk_i 1 1
正如您所看到的,vclock_spec与|之间存在空格哪个不应该在那里。我做错了什么?
答案 0 :(得分:1)
作为@Cyrus mentioned,Bash正则表达式不支持延迟量词。他们充当贪婪的人。
您可以使用
修复您的模式以使用Bashregex="\s*([^=]*\S)\s*=\s*(.*)\b"
^^^^^^^
[^=]*
匹配零个或多个符号,然后=
和\S
匹配任何非空格(可能[^\s=]
在这里会更精确,因为它匹配任何字符但一个空格(\s
)和=
,但看起来regex="\s*([^=]*[^\s=])\s*=\s*(.*)\b"
会产生相同的结果。)