2016-08-10 74 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

相關問題