为什么以下正则表达式不匹配?
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)
答案 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。