Regular Expressions

Specifying WHAT to Match - Part 2

In this tutorial we continue examining ways to specify WHAT text to match by exploring POSIX character classes and equivalence classes.

Character Classes

We saw earlier how a range expression like '[a-z]' works well with the English alphabet but it does not yield accurate results with other alphabets. POSIX character classes, on the other hand, are portable between languages.

With character classes you can match any one of a group of characters, like a lowercase character or a numeric digit, inside a character list pattern. Character class names take the format '[:class:]'. A character list containing a character class looks like '[[:class:]]'. "class" can be any one of the following terms.

Class Description
lower lowercase letters
upper uppercase letters
alpha all characters in the classes 'lower' and 'upper'
digit numeric digits
xdigit hexadecimal digits
alnum all characters in the classes 'alpha' and 'digit'
blank <space> and <tab>
space white-space characters
cntrl control characters
punct punctuation characters
graph printable characters, not including <space>
print printable characters, including <space>

See IEEE Std 1003.1, 2004 Edition, Section 7.3.1 LC_CTYPE for the official definition of each class.

This example shows how the class named 'lower' works, an alternative to using the range '[a-z]'.

execute set_pattern( '[[:lower:]]' )

execute set_target( '+24'   )
execute add_target( '-abc'  )
execute add_target( '.1415' )
execute add_target( '@@@'   )
execute add_target( 'ABC'   )
execute add_target( 'àéîõü' )

select * from test_results ;
 
PATTERN         TARGET     MATCH MATCHED_VALUE   POSITION
--------------- ---------- ----- --------------- --------
[[:lower:]]     +24        N     (null)                 0
                -abc       Y     a                      2
                .1415      N     (null)                 0
                @@@        N     (null)                 0
                ABC        N     (null)                 0
                àéîõü      Y     à                      1
 

The 'digit' class includes all numeric digits.

execute set_pattern( '[[:digit:]]' )

select * from test_results ;
 
PATTERN         TARGET     MATCH MATCHED_VALUE   POSITION
--------------- ---------- ----- --------------- --------
[[:digit:]]     +24        Y     2                      2
                -abc       N     (null)                 0
                .1415      Y     1                      2
                @@@        N     (null)                 0
                ABC        N     (null)                 0
                àéîõü      N     (null)                 0
 

To get all characters in both the 'lower' and the 'digit' classes, combine them like this.

execute set_pattern( '[[:lower:][:digit:]]' )

column pattern format a25

select * from test_results ;
 
PATTERN                   TARGET     MATCH MATCHED_VALUE   POSITION
------------------------- ---------- ----- --------------- --------
[[:lower:][:digit:]]      +24        Y     2                      2
                          -abc       Y     a                      2
                          .1415      Y     1                      2
                          @@@        N     (null)                 0
                          ABC        N     (null)                 0
                          àéîõü      Y     à                      1
 
column pattern format a15
 

This example shows how to exclude all characters in both classes.

execute set_pattern( '[^[:lower:][:digit:]]' )

column pattern format a25

select * from test_results ;
 
PATTERN                   TARGET     MATCH MATCHED_VALUE   POSITION
------------------------- ---------- ----- --------------- --------
[^[:lower:][:digit:]]     +24        Y     +                      1
                          -abc       Y     -                      1
                          .1415      Y     .                      1
                          @@@        Y     @                      1
                          ABC        Y     A                      1
                          àéîõü      N     (null)                 0
 
column pattern format a15
 

The following table shows how the first 256 Unicode characters map to POSIX classes. (Note: If you run the following snippet in SQL*Plus some of the values under the SYMBOL column may appear different in your system from what is shown. You should not see any differences if you use iSQL*Plus or SQL Developer.)

set null ''

select
  symbol, dec, hex,
  cntrl, punct, graph, print , upper, lower  ,
  alpha, alnum, digit, xdigit, blank, space
from
  character_class_map
order by
  dec
;
 

SYMBOL  DEC HEX  CNTRL PUNCT GRAPH PRINT UPPER LOWER ALPHA ALNUM DIGIT XDIGIT BLANK SPACE
------ ---- ---- ----- ----- ----- ----- ----- ----- ----- ----- ----- ------ ----- -----
NUL       0 0000 Y
SOH       1 0001 Y
STX       2 0002 Y
ETX       3 0003 Y
EOT       4 0004 Y
ENQ       5 0005 Y
ACK       6 0006 Y
BEL       7 0007 Y
BS        8 0008 Y
TAB       9 0009 Y                                                                  Y
LF       10 000A Y                                                                  Y
VT       11 000B Y                                                                  Y
FF       12 000C Y                                                                  Y
CR       13 000D Y                                                                  Y
SO       14 000E Y
SI       15 000F Y
DLE      16 0010 Y
DC1      17 0011 Y
DC2      18 0012 Y
DC3      19 0013 Y
DC4      20 0014 Y
NAK      21 0015 Y
SYN      22 0016 Y
ETB      23 0017 Y
CAN      24 0018 Y
EM       25 0019 Y
SUB      26 001A Y
ESC      27 001B Y
FS       28 001C Y
GS       29 001D Y
RS       30 001E Y
US       31 001F Y
         32 0020                   Y                                          Y     Y
!        33 0021       Y     Y     Y
"        34 0022       Y     Y     Y
#        35 0023       Y     Y     Y
$        36 0024       Y     Y     Y

SYMBOL  DEC HEX  CNTRL PUNCT GRAPH PRINT UPPER LOWER ALPHA ALNUM DIGIT XDIGIT BLANK SPACE
------ ---- ---- ----- ----- ----- ----- ----- ----- ----- ----- ----- ------ ----- -----
%        37 0025       Y     Y     Y
&        38 0026       Y     Y     Y
'        39 0027       Y     Y     Y
(        40 0028       Y     Y     Y
)        41 0029       Y     Y     Y
*        42 002A       Y     Y     Y
+        43 002B       Y     Y     Y
,        44 002C       Y     Y     Y
-        45 002D       Y     Y     Y
.        46 002E       Y     Y     Y
/        47 002F       Y     Y     Y
0        48 0030             Y     Y                       Y     Y     Y
1        49 0031             Y     Y                       Y     Y     Y
2        50 0032             Y     Y                       Y     Y     Y
3        51 0033             Y     Y                       Y     Y     Y
4        52 0034             Y     Y                       Y     Y     Y
5        53 0035             Y     Y                       Y     Y     Y
6        54 0036             Y     Y                       Y     Y     Y
7        55 0037             Y     Y                       Y     Y     Y
8        56 0038             Y     Y                       Y     Y     Y
9        57 0039             Y     Y                       Y     Y     Y
:        58 003A       Y     Y     Y
;        59 003B       Y     Y     Y
<        60 003C       Y     Y     Y
=        61 003D       Y     Y     Y
>        62 003E       Y     Y     Y
?        63 003F       Y     Y     Y
@        64 0040       Y     Y     Y
A        65 0041             Y     Y     Y           Y     Y           Y
B        66 0042             Y     Y     Y           Y     Y           Y
C        67 0043             Y     Y     Y           Y     Y           Y
D        68 0044             Y     Y     Y           Y     Y           Y
E        69 0045             Y     Y     Y           Y     Y           Y
F        70 0046             Y     Y     Y           Y     Y           Y
G        71 0047             Y     Y     Y           Y     Y
H        72 0048             Y     Y     Y           Y     Y
I        73 0049             Y     Y     Y           Y     Y

SYMBOL  DEC HEX  CNTRL PUNCT GRAPH PRINT UPPER LOWER ALPHA ALNUM DIGIT XDIGIT BLANK SPACE
------ ---- ---- ----- ----- ----- ----- ----- ----- ----- ----- ----- ------ ----- -----
J        74 004A             Y     Y     Y           Y     Y
K        75 004B             Y     Y     Y           Y     Y
L        76 004C             Y     Y     Y           Y     Y
M        77 004D             Y     Y     Y           Y     Y
N        78 004E             Y     Y     Y           Y     Y
O        79 004F             Y     Y     Y           Y     Y
P        80 0050             Y     Y     Y           Y     Y
Q        81 0051             Y     Y     Y           Y     Y
R        82 0052             Y     Y     Y           Y     Y
S        83 0053             Y     Y     Y           Y     Y
T        84 0054             Y     Y     Y           Y     Y
U        85 0055             Y     Y     Y           Y     Y
V        86 0056             Y     Y     Y           Y     Y
W        87 0057             Y     Y     Y           Y     Y
X        88 0058             Y     Y     Y           Y     Y
Y        89 0059             Y     Y     Y           Y     Y
Z        90 005A             Y     Y     Y           Y     Y
[        91 005B       Y     Y     Y
\        92 005C       Y     Y     Y
]        93 005D       Y     Y     Y
^        94 005E       Y     Y     Y
_        95 005F       Y     Y     Y
`        96 0060       Y     Y     Y
a        97 0061             Y     Y           Y     Y     Y           Y
b        98 0062             Y     Y           Y     Y     Y           Y
c        99 0063             Y     Y           Y     Y     Y           Y
d       100 0064             Y     Y           Y     Y     Y           Y
e       101 0065             Y     Y           Y     Y     Y           Y
f       102 0066             Y     Y           Y     Y     Y           Y
g       103 0067             Y     Y           Y     Y     Y
h       104 0068             Y     Y           Y     Y     Y
i       105 0069             Y     Y           Y     Y     Y
j       106 006A             Y     Y           Y     Y     Y
k       107 006B             Y     Y           Y     Y     Y
l       108 006C             Y     Y           Y     Y     Y
m       109 006D             Y     Y           Y     Y     Y
n       110 006E             Y     Y           Y     Y     Y

SYMBOL  DEC HEX  CNTRL PUNCT GRAPH PRINT UPPER LOWER ALPHA ALNUM DIGIT XDIGIT BLANK SPACE
------ ---- ---- ----- ----- ----- ----- ----- ----- ----- ----- ----- ------ ----- -----
o       111 006F             Y     Y           Y     Y     Y
p       112 0070             Y     Y           Y     Y     Y
q       113 0071             Y     Y           Y     Y     Y
r       114 0072             Y     Y           Y     Y     Y
s       115 0073             Y     Y           Y     Y     Y
t       116 0074             Y     Y           Y     Y     Y
u       117 0075             Y     Y           Y     Y     Y
v       118 0076             Y     Y           Y     Y     Y
w       119 0077             Y     Y           Y     Y     Y
x       120 0078             Y     Y           Y     Y     Y
y       121 0079             Y     Y           Y     Y     Y
z       122 007A             Y     Y           Y     Y     Y
{       123 007B       Y     Y     Y
|       124 007C       Y     Y     Y
}       125 007D       Y     Y     Y
~       126 007E       Y     Y     Y
DEL     127 007F Y
XXX     128 0080 Y
XXX     129 0081 Y
BPH     130 0082 Y
NBH     131 0083 Y
IND     132 0084 Y
NEL     133 0085 Y
SSA     134 0086 Y
ESA     135 0087 Y
HTS     136 0088 Y
HTJ     137 0089 Y
VTS     138 008A Y
PLD     139 008B Y
PLU     140 008C Y
RI      141 008D Y
SS2     142 008E Y
SS3     143 008F Y
DCS     144 0090 Y
PU1     145 0091 Y
PU2     146 0092 Y
STS     147 0093 Y

SYMBOL  DEC HEX  CNTRL PUNCT GRAPH PRINT UPPER LOWER ALPHA ALNUM DIGIT XDIGIT BLANK SPACE
------ ---- ---- ----- ----- ----- ----- ----- ----- ----- ----- ----- ------ ----- -----
CCH     148 0094 Y
MW      149 0095 Y
SPA     150 0096 Y
EPA     151 0097 Y
SOS     152 0098 Y
XXX     153 0099 Y
SCI     154 009A Y
CSI     155 009B Y
ST      156 009C Y
OSC     157 009D Y
PM      158 009E Y
APC     159 009F Y
        160 00A0       Y     Y     Y
¡       161 00A1       Y     Y     Y
¢       162 00A2       Y     Y     Y
£       163 00A3       Y     Y     Y
¤       164 00A4       Y     Y     Y
¥       165 00A5       Y     Y     Y
¦       166 00A6       Y     Y     Y
§       167 00A7       Y     Y     Y
¨       168 00A8       Y     Y     Y
©       169 00A9       Y     Y     Y
ª       170 00AA             Y     Y           Y     Y     Y
«       171 00AB       Y     Y     Y
¬       172 00AC       Y     Y     Y
SHY     173 00AD Y
®       174 00AE       Y     Y     Y
¯       175 00AF       Y     Y     Y
°       176 00B0       Y     Y     Y
±       177 00B1       Y     Y     Y
²       178 00B2                   Y
³       179 00B3                   Y
´       180 00B4       Y     Y     Y
µ       181 00B5             Y     Y           Y     Y     Y
¶       182 00B6       Y     Y     Y
·       183 00B7       Y     Y     Y
¸       184 00B8       Y     Y     Y

SYMBOL  DEC HEX  CNTRL PUNCT GRAPH PRINT UPPER LOWER ALPHA ALNUM DIGIT XDIGIT BLANK SPACE
------ ---- ---- ----- ----- ----- ----- ----- ----- ----- ----- ----- ------ ----- -----
¹       185 00B9                   Y
º       186 00BA             Y     Y           Y     Y     Y
»       187 00BB       Y     Y     Y
¼       188 00BC                   Y
½       189 00BD                   Y
¾       190 00BE                   Y
¿       191 00BF       Y     Y     Y
À       192 00C0             Y     Y     Y           Y     Y
Á       193 00C1             Y     Y     Y           Y     Y
       194 00C2             Y     Y     Y           Y     Y
à      195 00C3             Y     Y     Y           Y     Y
Ä       196 00C4             Y     Y     Y           Y     Y
Å       197 00C5             Y     Y     Y           Y     Y
Æ       198 00C6             Y     Y     Y           Y     Y
Ç       199 00C7             Y     Y     Y           Y     Y
È       200 00C8             Y     Y     Y           Y     Y
É       201 00C9             Y     Y     Y           Y     Y
Ê       202 00CA             Y     Y     Y           Y     Y
Ë       203 00CB             Y     Y     Y           Y     Y
Ì       204 00CC             Y     Y     Y           Y     Y
Í       205 00CD             Y     Y     Y           Y     Y
Î       206 00CE             Y     Y     Y           Y     Y
Ï       207 00CF             Y     Y     Y           Y     Y
Ð       208 00D0             Y     Y     Y           Y     Y
Ñ       209 00D1             Y     Y     Y           Y     Y
Ò       210 00D2             Y     Y     Y           Y     Y
Ó       211 00D3             Y     Y     Y           Y     Y
Ô       212 00D4             Y     Y     Y           Y     Y
Õ       213 00D5             Y     Y     Y           Y     Y
Ö       214 00D6             Y     Y     Y           Y     Y
×       215 00D7       Y     Y     Y
Ø       216 00D8             Y     Y     Y           Y     Y
Ù       217 00D9             Y     Y     Y           Y     Y
Ú       218 00DA             Y     Y     Y           Y     Y
Û       219 00DB             Y     Y     Y           Y     Y
Ü       220 00DC             Y     Y     Y           Y     Y
Ý       221 00DD             Y     Y     Y           Y     Y

SYMBOL  DEC HEX  CNTRL PUNCT GRAPH PRINT UPPER LOWER ALPHA ALNUM DIGIT XDIGIT BLANK SPACE
------ ---- ---- ----- ----- ----- ----- ----- ----- ----- ----- ----- ------ ----- -----
Þ       222 00DE             Y     Y     Y           Y     Y
ß       223 00DF             Y     Y           Y     Y     Y
à       224 00E0             Y     Y           Y     Y     Y
á       225 00E1             Y     Y           Y     Y     Y
â       226 00E2             Y     Y           Y     Y     Y
ã       227 00E3             Y     Y           Y     Y     Y
ä       228 00E4             Y     Y           Y     Y     Y
å       229 00E5             Y     Y           Y     Y     Y
æ       230 00E6             Y     Y           Y     Y     Y
ç       231 00E7             Y     Y           Y     Y     Y
è       232 00E8             Y     Y           Y     Y     Y
é       233 00E9             Y     Y           Y     Y     Y
ê       234 00EA             Y     Y           Y     Y     Y
ë       235 00EB             Y     Y           Y     Y     Y
ì       236 00EC             Y     Y           Y     Y     Y
í       237 00ED             Y     Y           Y     Y     Y
î       238 00EE             Y     Y           Y     Y     Y
ï       239 00EF             Y     Y           Y     Y     Y
ð       240 00F0             Y     Y           Y     Y     Y
ñ       241 00F1             Y     Y           Y     Y     Y
ò       242 00F2             Y     Y           Y     Y     Y
ó       243 00F3             Y     Y           Y     Y     Y
ô       244 00F4             Y     Y           Y     Y     Y
õ       245 00F5             Y     Y           Y     Y     Y
ö       246 00F6             Y     Y           Y     Y     Y
÷       247 00F7       Y     Y     Y
ø       248 00F8             Y     Y           Y     Y     Y
ù       249 00F9             Y     Y           Y     Y     Y
ú       250 00FA             Y     Y           Y     Y     Y
û       251 00FB             Y     Y           Y     Y     Y
ü       252 00FC             Y     Y           Y     Y     Y
ý       253 00FD             Y     Y           Y     Y     Y
þ       254 00FE             Y     Y           Y     Y     Y
ÿ       255 00FF             Y     Y           Y     Y     Y
 
set null '(null)'
 

Equivalence Classes

To match any character in the set of all its accented variations, use the equivalence class syntax '[=character=]'.

This example finds all accented variations of the character 'a'.

execute set_pattern( '[[=a=]]' )

execute set_target( 'a' )
execute add_target( 'à' )
execute add_target( 'á' )
execute add_target( 'ã' )
execute add_target( 'â' )
execute add_target( 'ä' )
execute add_target( 'å' )
execute add_target( 'æ' )
execute add_target( 'b' )
execute add_target( 'c' )
execute add_target( 'ç' )

select * from test_results ;
 
PATTERN         TARGET     MATCH MATCHED_VALUE   POSITION
--------------- ---------- ----- --------------- --------
[[=a=]]         a          Y     a                      1
                b          N     (null)                 0
                c          N     (null)                 0
                à          Y     à                      1
                á          Y     á                      1
                â          Y     â                      1
                ã          Y     ã                      1
                ä          Y     ä                      1
                å          Y     å                      1
                æ          N     (null)                 0
                ç          N     (null)                 0
 

Specifying an equivalence class for 'à' yields the same results as using 'a'.

execute set_pattern( '[[=à=]]' )

select * from test_results ;
 
PATTERN         TARGET     MATCH MATCHED_VALUE   POSITION
--------------- ---------- ----- --------------- --------
[[=à=]]         a          Y     a                      1
                b          N     (null)                 0
                c          N     (null)                 0
                à          Y     à                      1
                á          Y     á                      1
                â          Y     â                      1
                ã          Y     ã                      1
                ä          Y     ä                      1
                å          Y     å                      1
                æ          N     (null)                 0
                ç          N     (null)                 0
 

You can combine equivalence classes like this.

execute set_pattern( '[[=a=][=c=]]' )

select * from test_results ;
 
PATTERN         TARGET     MATCH MATCHED_VALUE   POSITION
--------------- ---------- ----- --------------- --------
[[=a=][=c=]]    a          Y     a                      1
                b          N     (null)                 0
                c          Y     c                      1
                à          Y     à                      1
                á          Y     á                      1
                â          Y     â                      1
                ã          Y     ã                      1
                ä          Y     ä                      1
                å          Y     å                      1
                æ          N     (null)                 0
                ç          Y     ç                      1
 



Linking to SQL Snippets ™

To link to this page in Oracle Technology Network Forums or OraFAQ Forums cut and paste this code.

  • [url=http://www.sqlsnippets.com/en/topic-10193.html]SQL Snippets: Regular Expressions - Specifying WHAT to Match - Part 2[/url]

To link to this page in HTML documents or Blogger comments cut and paste this code.

  • <a href="http://www.sqlsnippets.com/en/topic-10193.html">SQL Snippets: Regular Expressions - Specifying WHAT to Match - Part 2</a>

To link to this page in other web sites use the following values.

  • Link Text : SQL Snippets: Regular Expressions - Specifying WHAT to Match - Part 2
  • URL (href): http://www.sqlsnippets.com/en/topic-10193.html