bash中的正则表达式不规则

时间:2012-03-15 14:04:03

标签: regex bash

我看到有关正则表达式的所有信息但未能找到我的问题的解决方案。我希望以前没有涉及到这一点。像往常一样,我对获得解决方案并不感兴趣,而是理解为什么它以它的方式工作。只有这样,我才能学习bash及其复杂性。

我的例子:

#!/bin/bash
Stext="Hallo World"
re="(.[a-z]*)$"
[[ $Stext =~ $re ]]
DBTable=${BASH_REMATCH[1]}
echo $DBTable
DBTable=`expr "$Stext" : $re`
echo $DBTable

你们大多数人都可以猜到,我没有两次打印 世界 ,我不知道为什么。

到目前为止,我已经设法从expr版本中获得一些响应,将表达式转义为:

DBTable=`expr "$Stext" : '\(.[a-z]*\)$'`

这仍然不会产生预期的结果。

有人可以给我一些见解。

1 个答案:

答案 0 :(得分:3)

expr将正则表达式视为隐含地锚定在字符串的开头 - 也就是说,它隐式添加了^ - 因此您需要在感兴趣的点之前提供所有内容。此外,正如您所注意到的,您需要编写\(\)而不是(),因为expr使用基本正则表达式(BRE) ,而不是扩展正则表达式(ERE)。所以,这个:

expr 'Hallo World' : '.[a-z]* \(.[a-z]*\)$'

将打印World