2013-06-01 70 views
5

Làm thế nào tôi có thể kiểm tra xem một chuỗi cho trước chứa các ký tự số thuốc, ví dụ:Kiểm tra xem chuỗi chứa ký tự không phải chữ số

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

Bằng cách nhân vật tôi có nghĩa là tất cả mọi thứ không giữa 0-9. Tôi thấy các chủ đề tương tự nhưng không phải trong số họ nói về "không 0-9" trừ khi họ hiển thị nếu số a-z hoặc A-Z của nó.

Trả lời

3

Chỉ cần sử dụng một lớp nhân vật phủ nhận:

grep [^0-9] 

này sẽ phù hợp bất kỳ ký tự không phải số, và không dây bao gồm chỉ chữ số.

+0

chúng ta có thể sử dụng lớp ký tự, '[: digit:]' không? – tarabyte

2

Something như thế này:

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

hoặc

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

Chỉ cần bằng cách sử dụng bash khớp mẫu:

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

bạn cần^và $? Nếu bạn khớp với bất kỳ chữ số nào, đó là lỗi. – kdubs

+0

'= ~' có nghĩa là gì? – tarabyte

1

Một lựa chọn khác, một bash "ngăn chặn" kiểm tra

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

Hầu hết các đề xuất này trả về true nếu ký tự đầu tiên là chữ số, nhưng không tìm thấy lỗi trong chuỗi. Hàm dưới đây trả về true nếu toàn bộ chuỗi là chữ số, false nếu có bất kỳ chữ số nào được phát hiện trong chuỗi.

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

Và sau đó bạn có thể sử dụng một cái gì đó như 'nếu isdigit $ 1; sau đó echo "là chữ số"; khác echo "nop"; fi' – elysch

Các vấn đề liên quan