PLSQL中与正则表达式相关的运算函数主要有以下四个:
- REGEXP_LIKE:返回指定字符串是否符合给定的正则表达式;
- REGEXP_SUBSTR:返回在指定字符串中截取出的符合给定正则表达式的子串;
- REGEXP_INSTR:返回在指定字符串中符合给定正则表达式的子串的开始位置;
- REGEXP_REPLACE:返回将指定字符串中符合给定正则表达式的子串替换为指定子串后的结果。
一、REGEXP_LIKE的使用:
REGEXP_LIKE(String, Regexp)
String:指定字符串或字段内容,
Regexp:用以匹配的正则表达式。
例如,验证某字符串是否是电邮地址格式:
SELECT 1
FROM dual
WHERE regexp_like('mryou@live.com'
,'^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$');
二、REGEXP_SUBSTR的使用:
REGEXP_SUBSTR(String, Regexp, StartPos, Occurence, Mode)
String:指定字符串或字段内容,
Regexp:用以匹配的正则表达式,
StartPos:起始位置(从第几位开始正则表达式匹配),默认为1,
Ocurrence:指定第几个匹配子串,默认为1,
Mode:'i'-不区分大小写检索,'c'-区分大小写检索,'n'-点号(.)不匹配换行符,'m'-多行模式,'x'-忽略正则表达式中的空白字符,默认为'c'。
例如,在字符串中以逗号为分隔符,找到第三个子串:
SELECT regexp_substr('张三,男,1994-01-01,顺德大良', '[^,]+', 1, 3)
FROM dual;
三、REGEXP_INSTR的使用:
REGEXP_INSTR(String, Regexp, StartPos, Occurence, ReturnOpt, Mode)
String:指定字符串或字段内容,
Regexp:用以匹配的正则表达式,
StartPos:起始位置(从第几位开始正则表达式匹配),默认为1,
Ocurrence:指定第几个匹配子串,默认为1,
ReturnOpt:0-返回出现的开始位置,1-返回字符发生之后的位置(结束位置+1),默认为0,
Mode:'i'-不区分大小写检索,'c'-区分大小写检索,'n'-点号(.)不匹配换行符,'m'-多行模式,'x'-忽略正则表达式中的空白字符,默认为'c'。
例如,在一句话中以不区分大小写的要求,找到给定的若干字母中某一个字母第一次出现的位置:
SELECT regexp_instr('Muhammadun rasul Allah', 'l|m|n', 1, 1, 0, 'i')
FROM dual;
四、REGEXP_REPLACE的使用:
REGEXP_REPLACE(String, Regexp, ReplaceStr, StartPos, Occurence, Mode)
String:指定字符串或字段内容,
Regexp:用以匹配的正则表达式,
ReplaceStr:替换子串,默认为NULL,
StartPos:起始位置(从第几位开始正则表达式匹配),默认为1,
Ocurrence:指定第几个匹配子串,默认为1,
Mode:'i'-不区分大小写检索,'c'-区分大小写检索,'n'-点号(.)不匹配换行符,'m'-多行模式,'x'-忽略正则表达式中的空白字符,默认为'c'。
例如,隐藏手机号中间的四位数字:
SELECT regexp_replace('18806711314', '\d{4}', '大吉大利', 4, 1) FROM dual;
附一:正则表达式基本语法
Metacharacter | Description |
^ | 表示匹配字符串的开始位置,若用在中括号中[ ] 时,表示不匹配括号中字符串 |
$ | 表示匹配字符串的结束位置,若设置了表达式对象的Multiline属性(m),则也匹配'/n'或'/r' |
* | 表示匹配零次到多次(有或没有) |
+ | 表示匹配一次到多次(至少有一次) |
? | 表示匹配零次或一次(至多有一次) |
. | 表示匹配单个字符 |
| | 表示为或者,两项中取一项 |
() | 表示匹配括号中全部字符 |
[] | 表示匹配括号中一个字符,范围描述,如[0-9] [a-z] [A-Z] |
{} | 用于限定匹配次数,如 {n}表示匹配n个字符,{n,}表示至少匹配n个字符,{n,m}表示至少n个最多m个 |
\ | 转义字符,如上基本符号匹配都需要转义字符 ,如 \* 表示匹配*号 |
\w | 表示英文字母和数字 |
\W | 表示非字母和数字 |
\d | 表示数字 |
\D | 表示非数字 |
附二:部分常用正则表达式
Description | RegExp |
匹配由26个英文字母组成的字符串 | ^[A-Za-z]+$ |
匹配由26个英文字母的大写组成的字符串 | ^[A-Z]+$ |
匹配由26个英文字母的小写组成的字符串 | ^[a-z]+$ |
匹配由数字和26个英文字母组成的字符串 | ^[A-Za-z0-9]+$ |
匹配由数字、26个英文字母或者下划线组成的字符串 | ^\w+$ |
匹配整数 | ^-?[1-9]\d*$ |
匹配正整数 | ^[1-9]\d*$ |
匹配负整数 | ^-[1-9]\d*$ |
匹配非负整数 | ^[1-9]\d*|0$ |
匹配非正整数 | ^-[1-9]\d*|0$ |
电子邮箱 | ^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$ |
十六进制字符串 | ^#?([a-f0-9]{6}|[a-f0-9]{3})$ |
URL | ^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$ |
IP地址 | ^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ |
HTML标签 | ^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)$ |
SQL语句 | ^(select|drop|delete|create|update|insert).*$ |
大陆邮政编码 | ^[1-9]\d{5}(?!\d)$ |
纯Unicode编码中的汉字字符串 | ^[u4e00-u9fa5],{0,}$ |
空白行 | \n[\s| ]*\r |
首尾空格 | (^\s*)|(\s*$) |
双字节字符(含汉字) | [^\x00-\xff] |