如何匹配正则表达式中的数字

时间:2013-07-31 10:33:50

标签: regex bash

我正在尝试将一些行与包含数字的正则表达式进行匹配。

Bash版本3.2.25:

#!/bin/bash

s="AAA (bbb 123) CCC"
regex="AAA \(bbb \d+\) CCC"
if [[ $s =~ $regex ]]; then
  echo $s matches $regex
else
  echo $s doesnt match $regex
fi

结果:

AAA (bbb 123) CCC doesnt match AAA \(bbb \d+\) CCC

如果我放regex="AAA \(bbb .+\) CCC"它有效,但它不符合我的要求,只匹配数字。

为什么\d+不匹配123

2 个答案:

答案 0 :(得分:44)

使用标准字符集或符合POSIX标准:

[0-9]    
[[:digit:]]    

正如Finding only numbers at the beginning of a filename with regex中所述:

  

\d\w无法在POSIX regular expressions中使用,您可以使用[:digit:]

所以你的表达应该是以下之一:

regex="AAA \(bbb [0-9]+\) CCC"
#                ^^^^^^
regex="AAA \(bbb [[:digit:]]+\) CCC"
#                ^^^^^^^^^^^^

总之,你的脚本可以是这样的:

#!/bin/bash

s="AAA (bbb 123) CCC"
regex="AAA \(bbb [[:digit:]]+\) CCC"
if [[ $s =~ $regex ]]; then
  echo "$s matches $regex"
else
  echo "$s doesn't match $regex"
fi

让我们运行它:

$ ./digits.sh
AAA (bbb 123) CCC matches AAA \(bbb [[:digit:]]+\) CCC

答案 1 :(得分:7)

数字表示法\d不适用于您的bash版本。请改用[0-9]

regex="AAA \(bbb [0-9]+\) CCC"