Bash脚本在正则表达式上不匹配

时间:2015-11-06 19:09:15

标签: regex linux bash

我有以下bash脚本应该生成输出TEST

#!/bin/bash

test="TEST:THING - OBJECT_X"
if [[ $test =~ ^([a-zA-Z0-9]+)\:([a-zA-Z0-9]+)[A-Z\s\-_]+$ ]]; then
      echo ${BASH_REMATCH[1]}
fi

在我的正则表达式测试器中,正则表达式似乎匹配并捕获第一组和第二组:

https://regex101.com/r/kR1jM7/1

有什么想法导致这种情况吗?

1 个答案:

答案 0 :(得分:4)

\s是一个在ERE内部没有意义的PCRE结构。请改用[:space:]。此外,不是将短划线转义为\-,而是将-移动到字符集定义的最后。

以下作品:

[[ $test =~ ^([a-zA-Z0-9]+):([a-zA-Z0-9]+)[A-Z[:space:]_-]+$ ]]

也就是说,为了兼容更广泛的bash版本,请将正则表达式移动到变量中:

re='^([a-zA-Z0-9]+):([a-zA-Z0-9]+)[A-Z[:space:]_-]+$'
[[ $test =~ $re ]]

更积极地使用POSIX字符类(从而使代码更有可能跨语言和语言环境正常工作),还要考虑:

re='^([[:alnum:]]+):([[:alnum:]]+)[[:upper:][:space:]_-]+$'