代码是这样的:
#!/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$
有没有人有这方面的想法?
答案 0 :(得分:44)
在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
答案 1 :(得分:14)
您还可以将引用的正则表达式分配给变量:
#!/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
这不仅支持简单的引用,而且为正则表达式提供了一个有助于提高可读性的名称。
答案 2 :(得分:13)
感谢您的调试语句echo The regex matches!
,您应该注意到BASH_REMATCH
没有问题,因为if语句的计算结果为false
。
在bash中,与=~
一起使用的正则表达式是不加引号的。如果引用右侧的字符串,则将其视为字符串文字。
如果要在正则表达式中包含空格,请使用相应的字符类,或者如果需要空格,请转义空格。