您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

Oracle SQL 语句中正则表达式的应用

2025/11/8 22:18:59发布17次查看
regexp_like(匹配)regexp_instr (包含)regexp_replace(替换)regexp_substr(提取)如 手机号码的表达式: ^[1]{1}[35]{1}[[:digit:
regexp_like(匹配)
regexp_instr (包含)
regexp_replace(替换)
regexp_substr(提取)
如 手机号码的表达式: ^[1]{1}[35]{1}[[:digit:]]{9}$
查询客户信息表(tkhxx)中有手机号码(sjhm)的可以这样查询
1. select * form tkhxx where  regexp_like(sjhm,  '^[1]{1}[35]{1}[[:digit:]]{9}$' ) 
select * form tkhxx where regexp_like(sjhm, '^[1]{1}[35]{1}[[:digit:]]{9}$'
针对这个表达式解释一下
^ 表示开始
$ 表示结束
[]内部为匹配范围
{}里的内容表时个数
手机号码的特点是以 1开头接着是3或5再加9位的数字 所以这么理解
1开头 表达式为 ^[1]{1} 意为 开始1位里包含1
3或5 表达式为 [35]{1}
9位数字结束 为: [[:digit:]]{9}$ 这里[:digit:]为特殊写法,,代表为数字 再加个结束符$
用则表达式很简单,更高效
下面列一些参考,来自网络 :)
anchoring characters
^ anchoring characters
$ anchor the expression to the end of a line
equivalence classes
= =
oracle supports the equivalence classes through the posix '[==]' syntax. a base letter and all of its accented versions constitute an equivalence class. for example, the equivalence class '[=a=]' matches ?and ? the equivalence classes are valid only inside the bracketed expression
match options
c case sensitive matching
i case insensitive matching
m treat source string as multi-line activating anchor chars
n allow the period (.) to match any newline character
posix characters
[:alnum:] alphanumeric characters
[:alpha:] alphabetic characters
[:blank:] blank space characters
[:cntrl:] control characters (nonprinting)
[:digit:] numeric digits
[:graph:] any [:punct:], [:upper:], [:lower:], and [:digit:] chars
[:lower:] lowercase alphabetic characters
[:print:] printable characters
[:punct:] punctuation characters
[:space:] space characters (nonprinting), such as carriage return, newline, vertical tab, and form feed
[:upper:] uppercase alphabetic characters
[:xdigit:] hexidecimal characters
quantifier characters
* match 0 or more times
? match 0 or 1 time
+ match 1 or more times
{m} match exactly m times
{m,} match at least m times
{m, n} match at least m times but no more than n times
\n cause the previous expression to be repeated n times
alternative matching and grouping characters
| separates alternates, often used with grouping operator ()
( ) groups subexpression into a unit for alternations, for quantifiers, or for backreferencing (see backreferences section)
[char] indicates a character list; most metacharacters inside a character list are understood as literals, with the exception of character classes, and the ^ and - metacharacters
下面是个测试例子及环境
测试表
1. create table test ( 
2. testcol varchar2(50)); 
3.  
4. insert into test values ('abcde'); 
5. insert into test values ('12345'); 
6. insert into test values ('1a4a5'); 
7. insert into test values ('12a45'); 
8. insert into test values ('12abc'); 
9. insert into test values ('12abc'); 
10. insert into test values ('12ab5'); 
11. insert into test values ('12aa5'); 
12. insert into test values ('12ab5'); 
13. insert into test values ('abcde'); 
14. insert into test values ('123-5'); 
15. insert into test values ('12.45'); 
16. insert into test values ('1a4b5'); 
17. insert into test values ('1 3 5'); 
18. insert into test values ('1  45'); 
19. insert into test values ('1   5'); 
20. insert into test values ('a  b  c  d'); 
21. insert into test values ('a b  c   d    e'); 
22. insert into test values ('a              e'); 
23. insert into test values ('steven'); 
24. insert into test values ('stephen'); 
25. insert into test values ('111.222.3333'); 
26. insert into test values ('222.333.4444'); 
27. insert into test values ('333.444.5555'); 
28. commit; 
create table test ( testcol varchar2(50)); insert into test values ('abcde'); insert into test values ('12345'); insert into test values ('1a4a5'); insert into test values ('12a45'); insert into test values ('12abc'); insert into test values ('12abc'); insert into test values ('12ab5'); insert into test values ('12aa5'); insert into test values ('12ab5'); insert into test values ('abcde'); insert into test values ('123-5'); insert into test values ('12.45'); insert into test values ('1a4b5'); insert into test values ('1 3 5'); insert into test values ('1 45'); insert into test values ('1 5'); insert into test values ('a b c d'); insert into test values ('a b c d e'); insert into test values ('a e'); insert into test values ('steven'); insert into test values ('stephen'); insert into test values ('111.222.3333'); insert into test values ('222.333.4444'); insert into test values ('333.444.5555'); commit;
regexp_instr
regexp_instr(, , , , , )
find words beginning with 's' or 'r' or 'p' followed by any 4 alphabetic characters: case insensitive
1. select regexp_instr('500 oracle pkwy, redwood shores, ca', '[o][[:alpha:]]{3}', 1, 1, 0, 'i') result 
2. from dual; 
3.  
4. select regexp_instr('500 oracle pkwy, redwood shores, ca', '[o][[:alpha:]]{3}', 1, 1, 1, 'i') result 
5. from dual; 
6.  
7. select regexp_instr('500 oracle pkwy, redwood shores, ca', '[o][[:alpha:]]{3}', 1, 2, 0, 'i') result 
8. from dual; 
9.  
10. select regexp_instr('500 oracle pkwy, redwood shores, ca', '[o][[:alpha:]]{3}', 1, 2, 1, 'i') result 
11. from dual; 
select regexp_instr('500 oracle pkwy, redwood shores, ca', '[o][[:alpha:]]{3}', 1, 1, 0, 'i') result from dual; select regexp_instr('500 oracle pkwy, redwood shores, ca', '[o][[:alpha:]]{3}', 1, 1, 1, 'i') result from dual; select regexp_instr('500 oracle pkwy, redwood shores, ca', '[o][[:alpha:]]{3}', 1, 2, 0, 'i') result from dual; select regexp_instr('500 oracle pkwy, redwood shores, ca', '[o][[:alpha:]]{3}', 1, 2, 1, 'i') result from dual;
find the postiion of try, trying, tried or tries
1. select regexp_instr('we are trying to make the subject easier.', 'tr(y(ing)?|(ied)|(ies))') resultnum 
2. from dual; 
select regexp_instr('we are trying to make the subject easier.', 'tr(y(ing)?|(ied)|(ies))') resultnum from dual;
regexp_like
regexp_like(, , )
alphanumeric characters
1. select * 
2. from test 
3. where regexp_like(testcol, '[[:alnum:]]'); 
4.  
5. select * 
6. from test 
7. where regexp_like(testcol, '[[:alnum:]]{3}'); 
8.  
9. select * 
10. from test 
11. where regexp_like(testcol, '[[:alnum:]]{5}'); 
select * from test where regexp_like(testcol, '[[:alnum:]]'); select * from test where regexp_like(testcol, '[[:alnum:]]{3}'); select * from test where regexp_like(testcol, '[[:alnum:]]{5}');
alphabetic characters:
1. select * 
2. from test 
3. where regexp_like(testcol, '[[:alpha:]]'); 
4.  
5. select * 
6. from test 
7. where regexp_like(testcol, '[[:alpha:]]{3}'); 
8.  
9. select * 
10. from test 
11. where regexp_like(testcol, '[[:alpha:]]{5}'); 
select * from test where regexp_like(testcol, '[[:alpha:]]'); select * from test where regexp_like(testcol, '[[:alpha:]]{3}'); select * from test where regexp_like(testcol, '[[:alpha:]]{5}')
control characters
1. insert into test values ('zyx' || chr(13) || 'wvu'); 
2. commit; 
3.  
4. select * 
5. from test 
6. where regexp_like(testcol, '[[:cntrl:]]{1}'); 
insert into test values ('zyx' || chr(13) || 'wvu'); commit; select * from test where regexp_like(testcol, '[[:cntrl:]]{1}');
digits
1. select * 
2. from test 
3. where regexp_like(testcol, '[[:digit:]]'); 
4.  
5. select * 
6. from test 
7. where regexp_like(testcol, '[[:digit:]]{3}'); 
8.  
9. select * 
10. from test 
11. where regexp_like(testcol, '[[:digit:]]{5}'); 
select * from test where regexp_like(testcol, '[[:digit:]]'); select * from test where regexp_like(testcol, '[[:digit:]]{3}'); select * from test where regexp_like(testcol, '[[:digit:]]{5}');
lower case
1. select * 
2. from test 
3. where regexp_like(testcol, '[[:lower:]]'); 
4.  
5. select * 
6. from test 
7. where regexp_like(testcol, '[[:lower:]]{2}'); 
8.  
9. select * 
10. from test 
11. where regexp_like(testcol, '[[:lower:]]{3}'); 
12.  
13. select * 
14. from test 
15. where regexp_like(testcol, '[[:lower:]]{5}'); 
select * from test where regexp_like(testcol, '[[:lower:]]'); select * from test where regexp_like(testcol, '[[:lower:]]{2}'); select * from test where regexp_like(testcol, '[[:lower:]]{3}'); select * from test where regexp_like(testcol, '[[:lower:]]{5}');
printable characters
1. select * 
2. from test 
3. where regexp_like(testcol, '[[:print:]]{5}'); 
4.  
5. select * 
6. from test 
7. where regexp_like(testcol, '[[:print:]]{6}'); 
8.  
9. select * 
10. from test 
11. where regexp_like(testcol, '[[:print:]]{7}'); 
select * from test where regexp_like(testcol, '[[:print:]]{5}'); select * from test where regexp_like(testcol, '[[:print:]]{6}'); select * from test where regexp_like(testcol, '[[:print:]]{7}');
punctuation
1. truncate table test; 
2.  
3. select * 
4. from test 
5. where regexp_like(testcol, '[[:punct:]]'); 
truncate table test; select * from test where regexp_like(testcol, '[[:punct:]]');
spaces
1. select * 
2. from test 
3. where regexp_like(testcol, '[[:space:]]'); 
4.  
5. select * 
6. from test 
7. where regexp_like(testcol, '[[:space:]]{2}'); 
8.  
9. select * 
10. from test 
11. where regexp_like(testcol, '[[:space:]]{3}'); 
12.  
13. select * 
14. from test 
15. where regexp_like(testcol, '[[:space:]]{5}'); 
select * from test where regexp_like(testcol, '[[:space:]]'); select * from test where regexp_like(testcol, '[[:space:]]{2}'); select * from test where regexp_like(testcol, '[[:space:]]{3}'); select * from test where regexp_like(testcol, '[[:space:]]{5}')
upper case
1. select * 
2. from test 
3. where regexp_like(testcol, '[[:upper:]]'); 
4.  
5. select * 
6. from test 
7. where regexp_like(testcol, '[[:upper:]]{2}'); 
8.  
9. select * 
10. from test 
11. where regexp_like(testcol, '[[:upper:]]{3}');  
select * from test where regexp_like(testcol, '[[:upper:]]'); select * from test where regexp_like(testcol, '[[:upper:]]{2}'); select * from test where regexp_like(testcol, '[[:upper:]]{3}');
values starting with 'a%b'
1. select testcol 
2. from test 
3. where regexp_like(testcol, '^ab*');  
select testcol from test where regexp_like(testcol, '^ab*');
'a' is the third value
1. select testcol 
2. rom test  where regexp_like(testcol, '^..a.');  
select testcol from test where regexp_like(testcol, '^..a.');
contains two consecutive occurances of the letter 'a' or 'z'
1. select testcol  from test  where regexp_like(testcol, '([az])\1', 'i');  
select testcol from test where regexp_like(testcol, '([az])\1', 'i')
begins with 'ste' ends with 'en' and contains either 'v' or 'ph' in the center
1. select testcol from test where regexp_like(testcol, '^ste(v|ph)en$');  
select testcol from test where regexp_like(testcol, '^ste(v|ph)en$');
use a regular expression in a check constraint
1. create table mytest (c1 varchar2(20),  
2. check (regexp_like(c1, '^[[:alpha:]]+$')));  
3. identify ssn 
4.  
5. thanks: byron bush hioug  
6.  
7.  
8. create table ssn_test ( 
9. ssn_col  varchar2(20)); 
10.  
11. insert into ssn_test values ('111-22-3333'); 
12. insert into ssn_test values ('111=22-3333'); 
13. insert into ssn_test values ('111-a2-3333'); 
14. insert into ssn_test values ('111-22-33339'); 
15. insert into ssn_test values ('111-2-23333'); 
16. insert into ssn_test values ('987-65-4321'); 
17. commit; 
18.  
19. select ssn_col 
20. from ssn_test 
21. where regexp_like(ssn_col,'^[0-9]{3}-[0-9]{2}-[0-9]{4}$');  
create table mytest (c1 varchar2(20), check (regexp_like(c1, '^[[:alpha:]]+$'))); identify ssn thanks: byron bush hioug create table ssn_test ( ssn_col varchar2(20)); insert into ssn_test values ('111-22-3333'); insert into ssn_test values ('111=22-3333'); insert into ssn_test values ('111-a2-3333'); insert into ssn_test values ('111-22-33339'); insert into ssn_test values ('111-2-23333'); insert into ssn_test values ('987-65-4321'); commit; select ssn_col from ssn_test where regexp_like(ssn_col,'^[0-9]{3}-[0-9]{2}-[0-9]{4}$'
regexp_replace
syntax regexp_replace(, ,, , , )
looks for the pattern xxx.xxx.xxxx and reformats pattern to (xxx) xxx-xxxx col testcol format a15
col result format a15
1. select testcol, regexp_replace(testcol,'([[:digit:]]{3})\.([[:digit:]]{3})\.([[:digit:]]{4})', 
2. '(\1) \2-\3') result 
3. from test 
4. where length(testcol) = 12;  
select testcol, regexp_replace(testcol,'([[:digit:]]{3})\.([[:digit:]]{3})\.([[:digit:]]{4})', '(\1) \2-\3') result from test where length(testcol) = 12;
put a space after every character
1. select testcol, regexp_replace(testcol, '(.)', '\1 ') result 
2. from test   where testcol like 's%';  
select testcol, regexp_replace(testcol, '(.)', '\1 ') result from test where testcol like 's%';
replace multiple spaces with a single space
1. select regexp_replace('500    oracle    parkway, redwood    shores, ca', '( ){2,}', ' ') result 
2. from dual;  
select regexp_replace('500 oracle parkway, redwood shores, ca', '( ){2,}', ' ') result from dual
insert a space between a lower case character followed by an upper case character
1. select regexp_replace('george mcgovern', '([[:lower:]])([[:upper:]])', '\1 \2') city 
2. from dual;  
select regexp_replace('george mcgovern', '([[:lower:]])([[:upper:]])', '\1 \2') city from dual;
replace the period with a string (note use of '\')
1. select regexp_replace('we are trying to make the subject easier.','\.',' for you.') regext_sample 
2. from dual;  
select regexp_replace('we are trying to make the subject easier.','\.',' for you.') regext_sample from dual;
regexp_substr
syntax regexp_substr(source_string, pattern[, position [, occurrence[, match_parameter]]])
searches for a comma followed by one or more occurrences of non-comma characters followed by a comma
1. select regexp_substr('500 oracle parkway, redwood shores, ca', ',[^,]+,') result 
2. from dual;  
select regexp_substr('500 oracle parkway, redwood shores, ca', ',[^,]+,') result from dual;
look for followed by a substring of one or more alphanumeric characters and optionally, a period (.) col result format a50
1. select regexp_substr('go to and click on database', 
2. 'http://([[:alnum:]]+\.?){3,4}/?') result 
3. from dual;  
select regexp_substr('go to and click on database', 'http://([[:alnum:]]+\.?){3,4}/?') result from dual;
extracts try, trying, tried or tries
select regexp_substr('we are trying to make the subject easier.','tr(y(ing)?|(ied)|(ies))')
from dual;
extract the 3rd field treating ':' as a delimiter select regexp_substr('system/pwd@orabase:1521:sidval',
'[^:]+', 1, 3) result
from dual;
extract from string with vertical bar delimiter
1. create table regexp ( 
2. testcol varchar2(50)); 
3.  
4. insert into regexp 
5. (testcol) 
6. values 
7. ('one|two|three|four|five'); 
8.  
9. select * from regexp; 
10.  
11. select regexp_substr(testcol,'[^|]+', 1, 3) 
12. from regexp;  
create table regexp ( testcol varchar2(50)); insert into regexp (testcol) values ('one|two|three|four|five'); select * from regexp; select regexp_substr(testcol,'[^|]+', 1, 3) from regexp;
equivalence classes
1. select regexp_substr('iselfschooling not iselfschooling', '[[=i=]]selfschooling') result  
2. from dual;   
select regexp_substr('iselfschooling not iselfschooling', '[[=i=]]selfschooling') result from dual;
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product