为什么BASH_REMATCH不能用于引用正则expression式?

代码是这样的:

#!/bin/bash if [[ foobarbletch =~ 'foo(bar)bl(.*)' ]] then echo "The regex matches!" echo $BASH_REMATCH echo ${BASH_REMATCH[1]} echo ${BASH_REMATCH[2]} fi 

当我尝试运行它时,它不显示任何内容:

 bash-3.2$ bash --version GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin12) Copyright (C) 2007 Free Software Foundation, Inc. bash-3.2$ /bin/bash test_rematch.bash bash-3.2$ 

有没有人有这个想法? 谢谢!

在你的bash REGEX中,你应该删除引号。 这就是为什么这是行不通的。

如果你有空间,我推荐使用这种方式:

 #!/bin/bash x='foo bar bletch' if [[ $x =~ foo[[:space:]](bar)[[:space:]]bl(.*) ]] then echo The regex matches! echo $BASH_REMATCH echo ${BASH_REMATCH[1]} echo ${BASH_REMATCH[2]} fi 

感谢您的调试声明, echo The regex matches! ,你应该注意到BASH_REMATCH没有问题,因为if语句的计算结果是false

在bash中,与=~一起使用的正则表达式不加引号。 如果右侧的字符串被引用,则将其视为字符串文字。

如果你想在你的正则表达式中包含空格,那么使用合适的字符类,或者如果你想要一个空格,可以逃离你的空间。

您也可以将引用的正则表达式分配给一个变量:

 #!/bin/bash x='foobarbletch' foobar_re='foo(bar)bl(.*)' if [[ $x =~ $foobar_re ]] ; then echo The regex matches! echo ${BASH_REMATCH[*]} echo ${BASH_REMATCH[1]} echo ${BASH_REMATCH[2]} fi 

这不仅支持简单的引用,但给正则表达式可以帮助可读性的名称。