2016-08-10 76 views
1

为什么遵循正则表达式不匹配?为什么这个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/

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

+0

您应该知道'[[...]'是一个*括号表达式*大小写)范围*校对元素*是区域设置相关的。要禁用语言环境依赖关系,您可以在顶部添加一个“export LC_ALL = C”行,并且您的正则表达式将按照您定义的方式“工作”。然而,在这种情况下,'A-z'会比你需要的匹配更多(''''''''',',''''等等)。 –

回答

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_COLLATEC(开关关闭的区域设置),然后通过它们的ASCII码和z分类人物比A更大。否则(取决于您的区域设置)A大于A,因此正则表达式不正确,因此退出代码2.

+0

holly crap ...... – Antoniossss

+0

@Antoniossss:没错:)但我们已经解决了它 –

+0

接受答案即将到来。谢谢 – Antoniossss

相关问题