南大通用GBase 8c regexp函数功能说明
一、序言
本文基于GBase兼容Oracle的5大正则系列函数测试用例整理,覆盖REGEXP_LIKE、REGEXP_COUNT、REGEXP_INSTR、REGEXP_SUBSTR、REGEXP_REPLACE,完全对标Oracle数据库正则语法、参数规则、匹配标记(i/m/n/in/im)、换行.匹配逻辑、捕获分组、空值入参、异常入参校验规则,是数据库Oracle兼容语法落地、开发自测、迁移改造的参考文档。 本用例核心基准:所有SQL预期结果与Oracle原版执行结果保持一致,用于验证国产数据库Oracle兼容层正则引擎正确性。
二、正则修饰符(匹配模式,核心差异点)
| 标记 | 含义(Oracle 标准规则) |
|---|---|
| i | 大小写不敏感匹配 |
| m | 多行模式:^匹配每行开头、$匹配每行结尾,换行\n切分行 |
| n | .默认不匹配换行符CHR (10);无n/m 时.不能跨换行匹配 |
| 组合in/im | 多标记叠加,同时开启忽略大小写+ 多行 / 不跨行规则 |
关键规则:默认.不能匹配换行;m改变锚点^/$作用域、n控制.是否吞换行,是整套测试核心基准。
通用约束
- 负数入参(起始位置、匹配次数、分组号)Oracle 统一抛异常,兼容库需同步抛出报错;
- 任意参数传入NULL 遵循 Oracle 空值返回规则,分函数差异化处理;
- 正则捕获分组()支持序号取值,从 1 开始,0 代表完整匹配内容。
三、五大正则函数详细说明
3.1 REGEXP_LIKE正则匹配判断
作用:判断字符串是否匹配正则,返回布尔(true/false),对标 Oracle WHERE 条件判断逻辑。
语法:REGEXP_LIKE(源字符串,正则表达式[,修饰符])
换行测试:a||CHR(10)||d 场景: 无修饰、m:.不能跨换行,匹配 a.d 不命中; n:.可匹配换行,命中返回 true; 大小写i:GREEN 中重复元音 ee,不带 i 区分大小写不匹配,带 i 忽略大小写命中; 多行m:跨行文本 foo\nbar\nbaz,^bar 在 m 模式匹配行首 bar,默认不匹配; 组合标记in/im:同时控制大小写 + 换行锚点规则。
适用场景:WHERE 条件模糊筛选、数据规则校验。
3.2 REGEXP_COUNT正则匹配次数统计
作用:统计源串中正则匹配成功的总次数,返回整数;参数支持:REGEXP_COUNT(源,正则[,起始位置[,修饰符]]) 起始位置约束:起始位≤0 非法报错,同 Oracle ORA-01428; 贪婪匹配:123123123匹配(12)3重叠匹配计数,遵循Oracle非重叠匹配规则; 大小写 / 多行继承REGEXP_LIKE标记规则; 空源串、无匹配内容返回0。
适用场景:统计字段手机号 / 身份证 / 关键词出现频次。
3.3 REGEXP_INSTR正则匹配位置查找
作用:返回匹配内容起始下标(默认从1开始计数),Oracle全参数语法: REGEXP_INSTR(src,pattern[,pos[,occurrence[,opt[,flag[,group]]]]]) 参数释义 pos:查找起始下标;occurrence:第N次匹配; opt:0返回匹配起始位,1返回匹配结束后下标; flag:i/m/n修饰符;group:捕获分组编号,0 = 全匹配。 典型用例: 拆分英文语句单词,[^ ]+按空格分词,取第6个单词下标; 多级捕获(123)(4(56)(78)),通过group=4取最内层分组78位置; 非法值:pos/occurrence/group传负数直接抛出异常。
适用场景:截取指定位置关键字、结构化文本字段拆分。
3.4 REGEXP_SUBSTR 正则内容截取
作用:按正则截取匹配字符串,参数同REGEXP_INSTR,多分组取值。 语法:REGEXP_SUBSTR(源,正则[,起始位[,第几次匹配[,修饰符[,分组号]]]]) 分组规则:group=0返回完整匹配,≥1返回对应括号内捕获内容;无匹配返回NULL; 示例:,\s+([Zf][^,]+),i忽略大小写,group=1截取zipcode town; 起始位、匹配次数负数入参报错。
适用场景:从混杂文本提取手机号、邮箱、编号、URL。
3.5 REGEXP_REPLACE正则替换
作用:使用替换串替换正则匹配内容,Oracle标准全参数: REGEXP_REPLACE(src,pattern,repl[,pos[,occ[,flag]]]) 参数:pos起始位置,occ第N个匹配开始替换(0 = 全局全部替换);flag匹配修饰符; 特殊NULL规则(Oracle独有,重点兼容)
| 入参情况 | 返回结果 |
|---|---|
| 源串NULL | NULL |
| 正则pattern 为 NULL | 返回原字符串 |
| 替换repl 为 NULL | 匹配内容被清空删除 |
常用示例:连续多个空格( ){2,}替换为单个空格、手机号格式化512.123.4567→(512) 123-4567; 起始位、替换次数传负数触发异常;不支持g全局标记(Oracle无g,靠 occ=0全局替换)。 适用场景:数据清洗、格式标准化、敏感信息脱敏。
四、空值与异常入参规范(Oracle对齐重点)
1、NULL 参数规则
REGEXP_LIKE/COUNT/INSTR/SUBSTR:任一关键参数 NULL,返回 NULL;
REGEXP_REPLACE 特殊:pattern 为 NULL 直接返回原文本,区别其余函数。
2、非法数值入参
pos(起始下标)、occurrence(第 N 次匹配)、group(分组号)传入负数,全部抛出运行异常,对标 Oracle ORA-01428 错误。
3、非法修饰符:非 i/m/n 字符作为 flag,遵循 Oracle 原生容错逻辑。
评论
热门帖子
- 12025-12-01浏览数:183149
- 22023-05-09浏览数:25912
- 42023-09-25浏览数:19552
- 52020-05-11浏览数:18169