regex - Bash 脚本不会匹配正则表达式

标签 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

知道是什么原因造成的吗?

最佳答案

\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/

相关文章:

PHP - 将点后或点和空格后的首字母大写

一个字符或另一个字符的正则表达式?

regex - 使用正则表达式解析括号内的内容

linux - linux进程的内核堆栈

php - 限制 PHP 中 shell_script 的执行时间

至少一个字母和至少一个数字的 C# 正则表达式

bash - 如何检查可执行文件的路径扩展

linux - 合并排序 gzip 文件

bash 脚本错误让 : -: syntax error: operand expected (error token is "-")

c - x86_64中中断的开销是多少