2013-07-31 31 views
22

Tôi đang cố gắng khớp một số dòng với regex có chứa chữ số.Cách so khớp các chữ số trong regex

Bash phiên bản 3.2.25:

#!/bin/bash 

s="AAA (bbb 123) CCC" 
regex="AAA \(bbb \d+\) CCC" 
if [[ $s =~ $regex ]]; then 
    echo $s matches $regex 
else 
    echo $s doesnt match $regex 
fi 

Kết quả:

AAA (bbb 123) CCC doesnt match AAA \(bbb \d+\) CCC 

Nếu tôi đặt regex="AAA \(bbb .+\) CCC" nó hoạt động nhưng nó không đáp ứng yêu cầu của tôi để phù hợp với chữ số duy nhất.

Tại sao không \d+ khớp với 123?

Trả lời

31

Hoặc sử dụng ký tự chuẩn thiết lập hoặc ký hiệu POSIX-compliant:

[0-9]  
[[:digit:]]  

Như đọc trong Finding only numbers at the beginning of a filename with regex:

\d\w không làm việc trong POSIX regular expressions, bạn có thể sử dụng [:digit:] mặc dù

nên biểu hiện của bạn nên là một trong những:

regex="AAA \(bbb [0-9]+\) CCC" 
#    ^^^^^^ 
regex="AAA \(bbb [[:digit:]]+\) CCC" 
#    ^^^^^^^^^^^^ 

Tất cả cùng nhau, kịch bản của bạn có thể như thế này:

#!/bin/bash 

s="AAA (bbb 123) CCC" 
regex="AAA \(bbb [[:digit:]]+\) CCC" 
if [[ $s =~ $regex ]]; then 
    echo "$s matches $regex" 
else 
    echo "$s doesn't match $regex" 
fi 

Hãy chạy nó:

$ ./digits.sh 
AAA (bbb 123) CCC matches AAA \(bbb [[:digit:]]+\) CCC 
6

Ký hiệu chữ số \d không hoạt động với phiên bản bash của bạn. Sử dụng [0-9] thay vì:

regex="AAA \(bbb [0-9]+\) CCC" 
+0

Ít nhất với bash 4.3.11 (phiên bản đi kèm với Ubuntu 14.04) '[0-9] +' không hoạt động eit cô ấy, nhưng '[0-9] *' thì có. Có thể '+' không được hỗ trợ? –

+0

'[0-9] +' đã làm việc cho tôi trên BASH 3.2 cũ hơn vì vậy không chắc chắn tại sao Ubuntu BASH lại không thích nó. – anubhava

+0

Hmmm, đừng bận tâm, tôi đã nhầm lẫn: đó là 'grep' không xử lý' + '(ít nhất là không có tùy chọn bổ sung). Tôi đã bối rối vì kịch bản của tôi đều sử dụng bash regex match * và * grep. –

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