首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么BASH_REMATCH不适用于带引号的正则表达式?

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

Stack Overflow用户
提问于 2012-10-31 10:26:37
回答 3查看 49.7K关注 0票数 25

代码如下:

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

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

代码语言:javascript
复制
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$ 

有人对此有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-31 10:27:56

在bash REGEX中,您应该删除引号。这就是为什么它不工作的原因。

如果你有空间,我建议你这样做:

代码语言:javascript
复制
#!/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
票数 60
EN

Stack Overflow用户

发布于 2015-08-20 02:09:26

您还可以将引用的regexp赋值给变量:

代码语言:javascript
复制
#!/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

这不仅支持简单的引号,而且为regexp提供了一个有助于可读性的名称。

票数 21
EN

Stack Overflow用户

发布于 2012-10-31 10:49:25

多亏了调试语句echo The regex matches!,您应该已经注意到BASH_REMATCH没有问题,因为if语句的计算结果是false

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

如果希望在regex中包含空格,则使用适当的字符类,如果需要空格,则对空格进行转义。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13150411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档