2013-06-01 20 views
5

Jak mogę sprawdzić, czy dany ciąg zawiera znaki spoza numerycznych, przykłady:Sprawdź, czy ciąg zawiera znaki spoza cyfr

x11z returns > 0 
x$1 also returns > 0 
1111~ also returns > 0 

po znaku nie mam na myśli wszystko pomiędzy 0-9. Widziałem podobne wątki, ale żaden z nich nie mówi o "non 0-9", z wyjątkiem tego, że pokazuje, czy jest to a-z lub.

Odpowiedz

3

Wystarczy użyć zanegowane klasę postaci:

grep [^0-9] 

To dopasuje dowolny znak nienumeryczną, a nie ciągi składające się tylko z cyfr.

+0

czy możemy użyć klasy znaków, '[: cyfra:]'? – tarabyte

2

coś takiego:

if [[ "xf44wd" =~ [0-9]+ ]]; then 
    echo "contains $?" 
    else 
    echo "does no contains $?" 
fi 

lub

if [[ ! "xf44wd" =~ [0-9]+ ]]; then 
    echo "does not contains $?" 
    else 
    echo "contains $?" 
fi 
8

tylko za pomocą dopasowania bash Wzór:

[[ "$MY_VAR" =~ ^[^0-9]+$ ]] && echo "no digit in $MY_VAR" 
+0

potrzebujesz znaku^i $? Jeśli dopasujesz dowolną cyfrę, jest to błąd. – kdubs

+0

co oznacza '= ~"? – tarabyte

1

Inną opcją, bash "powstrzymywanie" check

[[ "xf4fgh" = *[^0-9]* ]] 
echo $? 
0 
[[ "1234" = *[^0-9]* ]] 
echo $? 
1 
2

Większość z tych sugestii zwraca wartość true, jeśli pierwszy znak jest cyfrą, ale nie znajduje błędów w ciągu znaków. Poniższa funkcja zwraca wartość true, jeśli cały ciąg jest cyframi, false, jeśli w ciągu znaków zostaną wykryte żadne znaki niebędące cyframi.

function isdigit() { 
    [ $# -eq 1 ] || return 1; 
    [[ $1 = *[^0-9]* ]] && return 1 
    return 0 
} 
+0

A potem możesz użyć czegoś takiego jak 'if isdigit $ 1; następnie echo "jest cyfrą"; else echo "nop"; fi' – elysch

Powiązane problemy