GBase 8c
其他
文章

南大通用GBase 8c regexp函数功能说明

发表于2026-06-04 13:51:45245次浏览12个评论

一、序言

本文基于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控制.是否吞换行,是整套测试核心基准。

通用约束

  1. 负数入参(起始位置、匹配次数、分组号)Oracle 统一抛异常,兼容库需同步抛出报错;
  2. 任意参数传入NULL 遵循 Oracle 空值返回规则,分函数差异化处理;
  3. 正则捕获分组()支持序号取值,从 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 原生容错逻辑。

评论

登录后才可以发表评论
GBase用户50900发表于 3个月前
写得很好,学习了!
GBase用户51966发表于 3个月前
内容详实,值得收藏。
GBase用户51511发表于 3个月前
干货满满,感谢楼主分享。
GBase用户51510发表于 3个月前
写得真不错,赞一个!
一个老汉发表于 3个月前
不错的文章,受益匪浅。
塔山发表于 3个月前
分析得很透彻,学习了。
佛洛伊得发表于 3个月前
干货满满,感谢楼主分享。
GBase用户47954发表于 3个月前
感谢作者的精彩分享!
用户头像
XX发表于 3个月前
感谢分享
GBase用户21182发表于 2个月前
五种正则函数对标 Oracle,修饰符与入参规则讲解细致,数据清洗迁移开发实用性很强。
GBase用户21143发表于 2个月前
整理的很好!有帮助
用户头像
郝老师发表于 2个月前
很详细