2017-06-20 41 views
1

我要檢查,如果一個變量通過正則表達式[a-z\-]+,我的嘗試是如何使用正則表達式和否定一個類內部的if else

NAME_A="something" 
NAME_B="Something_Wrong" 
VALID_CHARACTERS="[a-z\-]+" 

if [[ ! $NAME_A =~ $VALID_CHARACTERS ]]; then 
    echo "NAME_A failed"; 
    exit 1 
else 
    echo "NAME_A passed" 
fi 

if [[ ! $NAME_B =~ $VALID_CHARACTERS ]]; then 
    echo "NAME_B failed"; 
    exit 1 
else 
    echo "NAME_B passed" 
fi 

但如果條件總是如此。
online bash fiddle

回答

1

您需要添加啓動(^)和結束錨($),以表明啓動和模式的結束,分別匹配。沒有這些,正則表達式模式[a-z\-]+將始終返回給定輸入的匹配項,因爲在兩個輸入字符串中至少有一個小寫字母字符。

因此,使模式爲:

VALID_CHARACTERS="^[a-z\-]+$" 

Demo

+0

謝謝,這使的感覺。 – Rikard

0

你錯了正則表達式。將其更改爲「^ [a-z] +」,它將起作用。

NAME_A="something" 
NAME_B="Something_Wrong" 
VALID_CHARACTERS="^[a-z]+" 

if [[ ! $NAME_A =~ $VALID_CHARACTERS ]]; then 
    echo "NAME_A failed"; 
    exit 1 
else 
    echo "NAME_A passed" 
fi 

if [[ ! $NAME_B =~ $VALID_CHARACTERS ]]; then 
    echo "NAME_B failed"; 
    exit 1 
else 
    echo "NAME_B passed" 
fi 
0

你也可以去你的問題問,這是正則表達式的否定:

NAME_A="something" 
NAME_B="Something_Wrong" 
VALID_CHARACTERS="[^a-z-]" 

if [[ $NAME_A =~ $VALID_CHARACTERS ]]; then 
    echo "NAME_A failed"; 
    exit 1 
else 
    echo "NAME_A passed" 
fi 

if [[ $NAME_B =~ $VALID_CHARACTERS ]]; then 
    echo "NAME_B failed"; 
    exit 1 
else 
    echo "NAME_B passed" 
fi 
+0

在'[]內使用'^'是否定的,我不想接受這些字符。無論如何感謝您檢查。 – Rikard

+0

你似乎錯過了這個觀點,否定你所說的正則表達式只接受這些字符。所以如果字符串包含括號中的任何字符,那麼這是一個失敗。你有沒有嘗試過這些代碼? – grail

0

您可以通過使用擴展的水珠條件,因爲這避免正則表達式:

shopt -s extglob 
isvalid() { [[ $1 == +([a-z-]) ]]; } 

然後測試它:

isvalid "something-valid" && echo "ok" || echo "no" 
ok 

isvalid "something" && echo "ok" || echo "no" 
ok 


isvalid "something_wrong" && echo "ok" || echo "no" 
no