我有下面的 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
知道是什么原因造成的吗?
最佳答案
\s
是一个 PCRE 结构,在 ERE 内部没有意义。请改用 [: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:]_-]+$'
关于regex - Bash 脚本不会匹配正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33573941/