在bash正则表达式中匹配组

时间:2018-02-27 13:54:39

标签: regex bash

在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。

1 个答案:

答案 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