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

Regex Bash脚本在正则表达式上不匹配,regex,linux,bash,Regex,Linux,Bash,我有下面的bash脚本,它应该生成输出测试 #!/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 在我的正则表达式测试仪中,正则表达式似乎在第一组和第二组上进行匹配和捕获: 你知道这是什么原因吗?\s在ERE内部是没有意义的PCRE结构。改用[:space:][/

我有下面的bash脚本,它应该生成输出测试

#!/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
在我的正则表达式测试仪中,正则表达式似乎在第一组和第二组上进行匹配和捕获:


你知道这是什么原因吗?

\s
在ERE内部是没有意义的PCRE结构。改用
[:space:][/code>。此外,将
-
移动到字符集定义的最末端,而不是将破折号转义为
-

以下工作:

[[ $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:]_-]+$'

\s
是ERE内部没有意义的PCRE结构。改用
[:space:][/code>。此外,将
-
移动到字符集定义的最末端,而不是将破折号转义为
-

以下工作:

[[ $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:]_-]+$'

此外,测试仪配置为PCRE,但bash使用ERE<代码> >:<代码>与<代码>:< /代码>。我还强烈考虑使用<代码> [::上上:] /代码>代替<代码> -AZ,<代码> [::数字:] /代码>代替<代码> 0~9>代码>,或<代码> [Al:Un::] /<代码>代替<代码> [AZ-Z09] 。在启用了其他语言/区域设置的系统中,它们更可能正常工作。
[[$test=~^([^:]+])]
此外,测试仪配置为PCRE,但bash使用ERE。冒号不需要转义<代码> >:<代码>与<代码>:< /代码>。我还强烈考虑使用<代码> [::上上:] /代码>代替<代码> -AZ,<代码> [::数字:] /代码>代替<代码> 0~9>代码>,或<代码> [Al:Un::] /<代码>代替<代码> [AZ-Z09] 。在启用了其他语言/区域设置的系统中,它们更可能正常工作。
[[$test=~^([^::]+]]
关于PCRE与ERE的概念非常有趣。我不知道正则表达式有着如此不同的风格。您的答案确实有效:)(PCRE要求使用一系列扩展,其中一些扩展如果没有回溯就无法实现,这使得PCRE可能比常规正则表达式形式慢得多)。非常感谢!我需要在这方面做更多的研究。我真傻,以为不同的语言会使用相同的正则表达式格式。PCRE vs ERE的概念非常有趣。我不知道正则表达式有着如此不同的风格。您的答案确实有效:)(PCRE要求使用一系列扩展,其中一些扩展如果没有回溯就无法实现,这使得PCRE可能比常规正则表达式形式慢得多)。非常感谢!我需要在这方面做更多的研究。我真傻,竟然认为不同的语言会使用相同的正则表达式格式。