为什么这个Bash正则表达式不起作用?

时间:2016-08-10 08:48:00

标签: regex bash

为什么以下正则表达式不匹配?

dev="$1"
regex="[a-zA-z]+([0-9]+)"
echo $dev
if [[ "$dev" =~ $regex ]]
then
    echo "Got a match: ${BASH_REMATCH[1]}"
else
    echo "Could not craete routing table reference due to incorrect device name [$dev]"
fi

这给了我输出

tun0
Could not craete routing table reference due to incorrect device name [tun0]

在某些在线测试工具中使用相同的正则表达式可以正常工作。 http://regexraptor.net/

Bash版本GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu)

1 个答案:

答案 0 :(得分:4)

由于Z的小写。

应该如此:

regex="[a-zA-Z]+([0-9]+)"

而非[a-zA-z]+([0-9]+)就像你拥有它一样。

<强>更新。为什么[A-z]无效?

为什么正则表达式[A-z]无效?

并非总是如此。这取决于字符的排序顺序:A是否大于z? 订单配置为LC_COLLATE。

比较一下:

$ LC_COLLATE=C bash -c '[[ a =~ [A-z] ]] ; echo $?'
0
$ bash -c '[[ a =~ [A-z] ]] ; echo $?'
2

如果将LC_COLLATE设置为C(关闭切换区域设置),则按ASCII码和z排序的字符大于A。否则(取决于您的区域设置)A大于A且正则表达式不正确,因此退出代码2。