四个新的函数分别是:REGEXP_LIKE、REGEXP_INSTR、REGEXP_SUBSTR、和 REGEXP_REPLACE。它们在用法上与Oracle SQL 函数LIKE、INSTR、SUBSTR 和REPLACE 用法,但是它们使用POSIX 正则表达式代替了老的百分号(%)和通配符(_)字符。
可以使用"{m,n}" 指定一个精确地出现范围,其意思是“出现从m 次到n 次”;"{m}" 表示“正好m次”;而"{m,}" 表示“至少m次”。还可以使用圆括号组合字符的集合,使用"|"(竖线)表示可替换。例如,字符串'^([a-z]+|[0-9]+)$'将匹配所有由小写字母或数字组合成的字符串。
REGEXP_LIKE 与LIKE 操作符相似。如果第一个参数匹配正则表达式它就解析为TRUE。例如WHERE REGEXP_LIKE(ENAME,'^J[AO]','i') 将在ENAME 以JA 或JO 开始的情况下返回一行数据。'I' 参数指定正则表达式是大小写敏感的。另外还可以在CHECK 约束和函数索引中指定REGEXP_LIKE。例如:
|
这条语句使得ENAME 字段只能包含字母和数字字符(也就是说没有空格或者标点符号)。试图插入或者更新这些数据将导致一个ORA-2290 异常,或者检查约束的有效性。
REGEXP_INSTR 与INSTR 函数类似。它返回一个字符串中匹配一个正则表达式的第一个子串的开始位置。例如:
SELECT REGEXP_INSTR('The total is $400 for your purchase.','$[[:digit:]]+')
FROM DUAL;
这个查询返回14,即$400在字符串的开始位置。另外还可以指定子串出现的次数;开始搜索的位置;是返回匹配的位置还是返回匹配之后字符的位置。
REGEXP_SUBSTR 返回匹配一个正则表达式的子串。虽然结合使用SUBSTR 和REGEXP_INSTR 及LENGTH 也可以实现这一功能,但是使用这个函数却更为简单。
SELECT REGEXP_INSTR('one,two,three','[^,]*') FROM DUAL;
这个查询返回'one',将第一个参数看成一个逗号分隔的列表并返回第一个逗号之前的所有字符。
REGEXP_REPLACE 返回初始参数被匹配子串替换之后的结果。例如:
|
这个查询将查找一个华氏温度并将其转换为摄氏度。它将返回:'The temperature is -5°C'。
下面的特殊用法用的时候必须用[[表达式]]使用例如:[[:digit:]]{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(<source_string>, <pattern>, <start_position>, <occurrence>, <return_option>, <match_parameter>)
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(<source_string>, <pattern>, <match_parameter>)
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(<source_string>, <pattern>,<replace_string>, <position>, <occurrence>, <match_parameter>)
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 http:// followed by a substring of one or more alphanumeric characters and optionally, a period (.) col result format a50
1. SELECT REGEXP_SUBSTR('Go to http://www.oracle.com/products and click on database',
2. 'http://([[:alnum:]]+\.?){3,4}/?') RESULT
3. FROM dual;
SELECT REGEXP_SUBSTR('Go to http://www.oracle.com/products 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;