在bash中我有以下内容:
REGEX="(1.0.0|2.0.0)"
declare -a arr=("A:1.0.0" "B:1.0.0" "C:2.0.0" "D:2.0.1")
for i in "${arr[@]}"
do
echo "Found: $i"
if [[ "$i"=~"${REGEX}" ]]; then
echo "$i matches: ${REGEX}"
else
echo "$i DOES NOT match: ${REGEX}"
fi
done
我认为对于D:2.0.1
,它会打印...DOES NOT match...
,而是打印
Found: A:1.0.0
A:1.0.0 matches: (1.0.0|2.0.0)
Found: B:1.0.0
B:1.0.0 matches: (1.0.0|2.0.0)
Found: C:2.0.0
C:2.0.0 matches: (1.0.0|2.0.0)
Found: D:2.0.1
D:2.0.1 matches: (1.0.0|2.0.0)
那么我的REGEX组模式有什么问题?指定类似的组模式在其他语言中工作正常 - 例如像groovy。
答案 0 :(得分:5)
你在正则表达式匹配表达式中有一个拼写错误,以
开头if [[ "$i"=~"${REGEX}" ]]; then
应该写成
if [[ $i =~ ${REGEX} ]]; then
暗示你应该从不引用你的正则表达式。为了理解|
运算符的扩展正则表达式支持(ERE),你需要让它理解它不是一个文字字符串,它在双引号下处理它。
但是如果你仍然想引用你的正则表达式字符串 - bash
3.2 introduced a compatibility option compat31
(under New Features in Bash 1.l),它会将bash正则表达式引用行为恢复为3.1,它支持引用正则表达式字符串。您只需要通过扩展shell选项启用它
shopt -s compat31
现在用引号运行
if [[ $i =~ "${REGEX}" ]]; then