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> |
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