这里一共介绍以下四种搭配函数的正则表达:
RegExp_count(), RegExp_substr(), RegExp_replace(), RegExp_like().
需求1:计算字符串里面的符号个数
需求2:截取字符串中的某一位置的字符
需求3:分解拆分特定字符串,例如IP地址
需求4:数字和字母拆分
需求5:查询只有数字和字母类型的数据
需求1:计算字符串里面的符号个数(单个符号)
SELECT regexp_count('I,love,you',',') AS CountNum FROM dual;
需求1:计算字符串里面的符号个数(多个符号)
因为$通配符需要添加转义符""
SELECT regexp_count('Iaojdao#$doiahdoa#$hdoiaho','#$') AS CountNum FROM dual;
需求2:截取字符串中的某一位置的字符(第一位)
SELECT REGEXP_SUBSTR('17,20,23','[^,]+',1,1,'i') AS STR FROM DUAL;
需求2:截取字符串中的某一位置的字符(最后一位)
SELECT REGEXP_SUBSTR('17,20,23','[^,]+',1,3,'i') AS STR FROM DUAL;
需求2:截取字符串中的某一位置的字符(每一位数据)
介入Level伪列,连接返回的行数就等于字符的长度减去符号的数量+1,相当于数字的个数
SELECT REGEXP_SUBSTR('17,20,23', '[^,]+', 1, LEVEL) AS STR
FROM DUAL
CONNECT BY LEVEL <=
LENGTH('17,20,23') - LENGTH(REGEXP_REPLACE('17,20,23', ',', ''))+1;
需求3:分解拆分特定字符串,例如IP地址
SELECT REGEXP_substr(v.ip,'[^.]+',1,1) a,
REGEXP_substr(v.ip,'[^.]+',1,2) b,
REGEXP_substr(v.ip,'[^.]+',1,3) c,
REGEXP_substr(v.ip,'[^.]+',1,4) d
FROM (SELECT '192.168.1.130' AS ip FROM dual) v;
需求4:数字和字母拆分
DROP TABLE dept1 PURGE;
CREATE TABLE dept1 AS
SELECT dname || deptno AS DATA FROM dept;
SELECT * FROM dept1;
SELECT regexp_replace(DATA,'[0-9]','') AS dname,
regexp_replace(DATA,'[a-zA-Z]','') AS deptno
-- regexp_replace(data,'[^0-9]','') as deptno
FROM dept1;
需求5:查询只有数字和字母类型的数据
CREATE OR REPLACE VIEW v1 AS
SELECT '123' AS DATA FROM dual UNION ALL
SELECT 'abc' AS DATA FROM dual UNION ALL
SELECT '123abc' AS DATA FROM dual UNION ALL
SELECT 'abc123' AS DATA FROM dual UNION ALL
SELECT 'a1b2c3' AS DATA FROM dual UNION ALL
SELECT 'abc#' AS DATA FROM dual UNION ALL
SELECT '3¥' AS DATA FROM dual;
Like : 只要带有数字或者字母的。
SELECT DATA FROM v1 WHERE regexp_like(DATA,'[0-9a-zA-Z]');
SELECT DATA FROM v1 WHERE regexp_like(DATA,'^[0-9a-zA-Z]');
Like: 字符串里面只有数字或者字母的。
-- ^ 在[]外面代表字符串开始, +$ 在[]外面代表字符串结束
-- * 匹配子表达式零次或者多次, + 匹配子表达式一次或多次。
Eg:
-- > regexp_like(str,'gan+') 加号前的表达式是n, 至少要匹配n一次。等价于like 'gan%'
-- > regexp_like(str,'gan*') 加号前的表达式是n, 至少要匹配n零次。等价于like 'ga%'