我看到了很多关于正则表达式的信息,但找不到解决我的问题的方法。我希望之前没有涉及到这一点。像往常一样,我对获得解决方案并不那么感兴趣,而是想了解它为什么会这样工作。只有这样我才能学习 bash 及其所有的复杂性。
我的例子:
#!/bin/bash
Stext="Hallo World"
re="(.[a-z]*)$"
[[ $Stext =~ $re ]]
DBTable=${BASH_REMATCH[1]}
echo $DBTable
DBTable=`expr "$Stext" : $re`
echo $DBTable
正如你们大多数人所猜到的,我没有将 World 打印两次,我也不知道为什么。
到目前为止,在将表达式转义为:
DBTable=`expr "$Stext" : '\(.[a-z]*\)$'`
这仍然没有产生预期的结果。
任何人都可以给我一些见解吗?
最佳答案
expr
将正则表达式视为隐式锚定在字符串的开头——也就是说,它隐式添加了一个 ^
——因此您需要在点之前提供所有内容兴趣。此外,正如您所注意到的,您需要编写 \(
and \)
而不是 (
and )
,因为 expr
使用基本正则表达式 (BRE),而不是扩展正则表达式 (ERE)。所以,这:
expr 'Hallo World' : '.[a-z]* \(.[a-z]*\)$'
将打印World
。
关于regex - bash 中的正则表达式不规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9721356/