【问题标题】:Why does BASH_REMATCH not work for a quoted regular expression?为什么 BASH_REMATCH 不适用于带引号的正则表达式?
【发布时间】:2018-04-14 09:36:57
【问题描述】:

代码是这样的:

#!/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$ 

有人对此有想法吗?

【问题讨论】:

    标签: regex bash


    【解决方案1】:

    在您的 bash 正则表达式中,您应该删除引号。这就是为什么这不起作用。

    如果你有空间,我建议使用这种方式:

    #!/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
    

    【讨论】:

    • 谢谢!但是如果空格键出现在REGEX中没有使用引号怎么办?
    • @Firegun 另外,你也可以用\ ' '" " 来表示一个空格(选择你的毒)(第一个没出现好,后面是反斜杠按空间)
    • 您可以使用引号,但不能围绕正则表达式元字符。例如,这行得通:[[ foobarbletch =~ 'foo'('bar')'bl'(.*) ]] 所以请随意引用任何空格 - 而不是整个字符串。
    • 也不要忘记用反斜杠转义文字引号。
    【解决方案2】:

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

    #!/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
    

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

    【讨论】:

      【解决方案3】:

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

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

      如果您想在正则表达式中包含空格,请使用适当的字符类,或者如果您需要空格,请转义您的空格。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多