为什么BASH_REMATCH不适用于引用的正则表达式?

Han*_*Sun 17 regex bash

代码是这样的:

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

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

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$ 
Run Code Online (Sandbox Code Playgroud)

有没有人有这个想法?

Gil*_*not 47

在您的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
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用引号,而不是使用正则表达式元字符.例如,这有效:`[[foobarbletch = ~'foo'('bar')'bl'(.*)]]`所以随意引用任何空格 - 而不是整个字符串. (2认同)

小智 15

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

#!/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
Run Code Online (Sandbox Code Playgroud)

这不仅支持简单的引用,而且为正则表达式提供了一个有助于提高可读性的名称.


小智 13

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

在bash中,使用的正则表达式=~是不带引号的.如果引用右侧的字符串,则将其视为字符串文字.

如果要在正则表达式中包含空格,请使用相应的字符类,或者如果需要空格,则转义空格.