我有以下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
有什么想法导致这种情况吗?
答案 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:]_-]+$'