Regex 正则表达式运算符和grep-E失败

Regex 正则表达式运算符和grep-E失败,regex,bash,Regex,Bash,我在这里找到了最适合我需要的正则表达式: 但当我用bash regex操作符测试它时,它总是失败: if [[ 'ABC' =~ ^(?!.*(.).*\1)[ABC]+$ ]]; then echo "success" else echo "fail" fi 我也用grep试过: echo "ABC" | grep -E "^(?!.*(.).*\1)[ABC]+$" 但是我得到

我在这里找到了最适合我需要的正则表达式:

但当我用bash regex操作符测试它时,它总是失败:

if [[ 'ABC' =~ ^(?!.*(.).*\1)[ABC]+$ ]]; then
        echo "success"
else
        echo "fail"
fi
我也用grep试过:

echo "ABC" | grep -E "^(?!.*(.).*\1)[ABC]+$"

但是我得到了“grep:Invalid back reference”

POSIX ERE中不支持查找,因此需要引入第二个条件:

s='ABCC'
rx1='^[ABC]+$'
rx2='().*\1'
如果[[“$s”=~$rx1&!”$s”=~$rx2]];然后
呼应“成功”
其他的
回应“失败”
fi

详情:

  • “$s”=~^[ABC]+$
    -检查整个
    s
    字符串是否由一个或多个
    A
    B
    C
    字符组成
  • &&!“$s”=~().*\1
    -另一个条件要求
    s
    字符串没有重复字符

您应该使用grep的
-p

echo "ABC" | grep -P '^(?!.*(.).*\1)[ABC]+$'

这是完美的,但是,它只适用于GNU grep。ABCC给出“成功”而不是失败:(@Giulio让我们使用最佳实践,用分配给变量的单引号字符串定义正则表达式模式。这样shell就不会用转义来欺骗我们。这种方法如预期的那样工作,并且在Bash中工作,而不依赖于是否有GNU grep。