What's the difference between \d , [:digit:], and [0-9] in regular expression ?


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting What's the difference between \d , [:digit:], and [0-9] in regular expression ?
# 1  
Old 08-29-2011
What's the difference between \d , [:digit:], and [0-9] in regular expression ?

Hello,
Code:
[river@localhost ate]$ [[ "123" =~ \d ]] && echo "ok" || echo "error";
error
[river@localhost ate]$ [[ "123" =~ [:digit:] ]] && echo "ok" || echo "error";
error
[river@localhost ate]$ [[ "123" =~ [0-9] ]] && echo "ok" || echo "error";
ok
[river@localhost ate]$

It seems that \d , [:digit:], and [0-9] are not the same.According to the regular expression reference, \d , [:digit:], and [0-9] have the same meaning, which represent a digit, but why not them work on linux?

Code:
[river@localhost ate]$ [[ "123" =~ \b[0-9]{3}\b ]] && echo "ok" || echo "error";
error

I am very puzzled for the above, "123" should match \b[0-9]{3}\b, but why it not ?
Thanks!
# 2  
Old 08-29-2011
Different languages implement regular expressions differently, you should check the manual pages of your shell.

This is bash:

Code:
4.1.10(4)-release$ [[ 123 =~ [0-9] ]] && echo ok || echo ko
ok
4.1.10(4)-release$ [[ 123 =~ [[:digit:]] ]] && echo ok || echo ko
ok

This is Perl:

Code:
4.1.10(4)-release$ perl -le'print 123 =~ /\d/ ? ok : ko," <-> ", a =~ /\d/ ? ok : ko'
ok <-> ko

Which shell and operating system are you using?

Last edited by radoulov; 08-29-2011 at 05:48 AM..
This User Gave Thanks to radoulov For This Post:
# 3  
Old 08-29-2011
Thanks ,my OS is fedora 15 . shell type is : sh-4.2

---------- Post updated at 08:19 PM ---------- Previous update was at 08:13 PM ----------

Thanks , as [0-9] works, but why "\b[0-9]{3}\b" does not work ?
Code:
[river@localhost ate]$ [[ "123" =~ \b[0-9]{3}\b ]] && echo "ok" || echo "error";
error

# 4  
Old 08-29-2011
First of all there is no such shell type as 'sh-4.2'. You are probably using the Bash shell if you are on fedora 15. To find out the version of bash shell you are using do:
Code:
$ echo $BASH_VERSION
4.2.10(1) - release

Quote:
but why "\b[0-9]{3}\b" does not work ?
because (1) \b is unsupported in Bash regular expressions and (2) even if it were supported, your RE would be incorrect.

As other have pointed out, there are different "families" of regular expressions. Some of the more common of these are:

- BRE Basic Regular Expressions.
- ERE Extended Regular Expressions

Perl, Korn Shell 93, Python, XSLT and more support additional RE functionality.

Just because you read it on a website or in a book, does not mean that that particular RE example will work in the bash shell.

By the way, \b is a GNU extension available in glibc's regcomp(), but not required by POSIX. All the mainstream shells that I am aware of do their own RE handling and do not depend on library functions such as regcomp/regexec or the older regcmp/regex.
# 5  
Old 08-30-2011
Also, range expressions (e.g. [0-9]) are only defined for the C/POSIX locale.

Regards,
Alister
# 6  
Old 09-01-2011
Thanks, what represents for word boundary in the bash shell if it isn't "\b" ?

---------- Post updated at 03:12 AM ---------- Previous update was at 03:04 AM ----------

Thanks all!
The following works ok in bash shell:
Code:
[river@localhost ~]$ [[ "123" =~ [[:digit:]]{3} ]] && echo "ok" || echo "error"
ok
[river@localhost ~]$ [[ "123" =~ [0-9]{3} ]] && echo "ok" || echo "error"
ok

The following is what I want:
Code:
[river@localhost ~]$ reg='\b[0-9]{3}\b'
[river@localhost ~]$ [[ "123" =~ $reg ]] && echo "ok" || echo "error"
ok

However, why I must put the expression in a variable .
Code:
[river@localhost ~]$ [[ "123" =~ \b[0-9]{3}\b ]] && echo "ok" || echo "error"
error

# 7  
Old 09-01-2011
Different bash versions on different platforms yield different results.
I'm not sure why with certain versions on some platforms it seems to work when I quote the escape sequences:


Code:
$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 5.1 (Tikanga)
$ echo $BASH_VERSION
3.1.17(1)-release
$ [[ "123" =~ \b[0-9]{3}\b ]] && echo "ok" || echo "error"
error
$ [[ "123" =~ "\b[0-9]{3}\b" ]] && echo "ok" || echo "error"
ok
$ [[ "123" =~ \\b[0-9]{3}\\b ]] && echo "ok" || echo "error"
ok




Code:
4.2.8(1)-release$ lsb_release -d
Description:    Ubuntu 11.04
4.2.8(1)-release$ [[ "123" =~ \b[0-9]{3}\b ]] && echo "ok" || echo "error"
error
4.2.8(1)-release$ [[ "123" =~ "\b[0-9]{3}\b" ]] && echo "ok" || echo "error"
error

Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Regular expression

Hello Gurus, I am looking for regular expressions for awk to filter on second column 2nd and 3rd digit Using in code something like: awk '{if ( $2 == "0::" ) print} source file: 0 0:0:0 FC 15 normal 559104 51200 0:3:1* 1:3:1 600 1 0:0:1 FC 15 normal ... (2 Replies)
Discussion started by: vishalgoyal
2 Replies

2. Shell Programming and Scripting

Regular expression for 6 digit number present in a line

Hello Team, i have a file test1.txt, in which i have to grep only the 6 digit number from it, Could you pls help in this. $cat test1.txt <description>R_XYZ_1.6 r370956</description> $ grep "\{6\}" test1.txt <description>R_XYZ_1.6 r370956</description> i need output as 370956. ... (3 Replies)
Discussion started by: chandana hs
3 Replies

3. UNIX for Dummies Questions & Answers

Difference between space and [[:space:]] in regular expression

May I know the difference between space in keyboard and ] in regular expression I entered the following find . -type f -print | xargs grep -n 'dt=' | cut -d":" -f3 | sed 's/^ *dt=/dt=/g' After "^" there is a space. and the result is... dt=`date +%Y%m%d%H%M%S` dt=`date +%Y%m%d`... (6 Replies)
Discussion started by: bobbygsk
6 Replies

4. UNIX for Advanced & Expert Users

sed: -e expression #1, char 0: no previous regular expression

Hello All, I'm trying to extract the lines between two consecutive elements of an array from a file. My array looks like: problem_arr=(PRS111 PRS213 PRS234) j=0 while } ] do k=`expr $j + 1` sed -n "/${problem_arr}/,/${problem_arr}/p" problemid.txt ---some operation goes... (11 Replies)
Discussion started by: InduInduIndu
11 Replies

5. Programming

Perl: How to read from a file, do regular expression and then replace the found regular expression

Hi all, How am I read a file, find the match regular expression and overwrite to the same files. open DESTINATION_FILE, "<tmptravl.dat" or die "tmptravl.dat"; open NEW_DESTINATION_FILE, ">new_tmptravl.dat" or die "new_tmptravl.dat"; while (<DESTINATION_FILE>) { # print... (1 Reply)
Discussion started by: jessy83
1 Replies

6. Shell Programming and Scripting

Integer expression expected: with regular expression

CA_RELEASE has a value of 6. I need to check if that this is a numeric value. if not error. source $CA_VERSION_DATA if * ] then echo "CA_RELESE $CA_RELEASE is invalid" exit -1 fi + source /etc/ncgl/ca_version_data ++ CA_PRODUCT_ID=samxts ++ CA_RELEASE=6 ++ CA_WEEK_NO=7 ++... (3 Replies)
Discussion started by: ketkee1985
3 Replies

7. Shell Programming and Scripting

Regular expression

Hi I have to extract the first field and the last %field of the following out put.. /home (/abc/def/bhd ) : 522328 total allocated Kb 319448 free allocated Kb ... (2 Replies)
Discussion started by: Harikrishna
2 Replies

8. Linux

Regular expression to extract "y" from "abc/x.y.z" .... i need regular expression

Regular expression to extract "y" from "abc/x.y.z" (2 Replies)
Discussion started by: rag84dec
2 Replies

9. Shell Programming and Scripting

regular expression

Hi all, My log file is like 19:40:22 INFO :Total time taken to Service External Request---15ms 19:40:22 INFO : External service failed with status KO 19:40:22 FATAL: External service failed with status KO 19:40:22 DEBUG : Batch started with 19:40:22 ERROR: Member: dmidecode.x86_64... (1 Reply)
Discussion started by: subin_bala
1 Replies

10. Shell Programming and Scripting

Regular Expression + Aritmetical Expression

Is it possible to combine a regular expression with a aritmetical expression? For example, taking a 8-numbers caracter sequece and casting each output of a grep, comparing to a constant. THX! (2 Replies)
Discussion started by: Z0mby
2 Replies
Login or Register to Ask a Question