You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle CLOB字段正则提取A/B/C字段及格式验证求助

Oracle CLOB字段的格式验证与内容提取方案

一、格式验证的正则实现

要严格验证CLOB字段内容是否符合规范,可使用Oracle的REGEXP_LIKE函数,正则会确保整个内容仅由合法的A/B/C块组成(允许块缺失、顺序任意、块间有空白):

REGEXP_LIKE(clob_column, '^(\s*<br />\s*<b>\s*[ABC]:\s*</b>\s*<br />\s*(?:(?!<br />\s*<b>\s*[ABC]:).)*)*\s*$', 'n')

正则说明:

  • ^和$锁定整个字符串的首尾,避免出现规范外的内容
  • \s*匹配任意空白(含换行、空格),兼容块间的任意分隔
  • (?:(?!<br />\s*<b>\s*[ABC]:).)*是非贪婪匹配,确保每个块的内容不会包含下一个块的开头标识,精准截取到当前块结束
  • 整个模式允许0到多个合法块,满足A/B/C可能缺失的场景
  • 'n'参数让.匹配换行符,支持内容含换行的情况

二、提取A/B/C字段内容

针对每个目标字段,使用REGEXP_SUBSTR结合捕获组提取内容,同时处理CLOB类型的换行问题:

提取A内容

TRIM(REGEXP_SUBSTR(clob_column, '<br />\s*<b>\s*A:\s*</b>\s*<br />\s*((?:(?!<br />\s*<b>\s*[ABC]:).)*)', 1, 1, 'n', 1))

提取B内容

TRIM(REGEXP_SUBSTR(clob_column, '<br />\s*<b>\s*B:\s*</b>\s*<br />\s*((?:(?!<br />\s*<b>\s*[ABC]:).)*)', 1, 1, 'n', 1))

提取C内容

TRIM(REGEXP_SUBSTR(clob_column, '<br />\s*<b>\s*C:\s*</b>\s*<br />\s*((?:(?!<br />\s*<b>\s*[ABC]:).)*)', 1, 1, 'n', 1))

说明:

  • TRIM用于去除内容前后的空白(换行、空格等)
  • 捕获组((?:(?!...).)*)精准获取当前字段的内容,直到下一个块开头或字符串结束
  • 'n'参数确保.能匹配换行符,支持内容包含换行的场景

完整示例查询

假设表名为test_table,CLOB字段为content_clob,以下SQL可同时完成格式验证和内容提取:

SELECT
  content_clob,
  CASE WHEN REGEXP_LIKE(content_clob, '^(\s*<br />\s*<b>\s*[ABC]:\s*</b>\s*<br />\s*(?:(?!<br />\s*<b>\s*[ABC]:).)*)*\s*$', 'n') THEN '是' ELSE '否' END AS 是否有效,
  TRIM(REGEXP_SUBSTR(content_clob, '<br />\s*<b>\s*A:\s*</b>\s*<br />\s*((?:(?!<br />\s*<b>\s*[ABC]:).)*)', 1, 1, 'n', 1)) AS A,
  TRIM(REGEXP_SUBSTR(content_clob, '<br />\s*<b>\s*B:\s*</b>\s*<br />\s*((?:(?!<br />\s*<b>\s*[ABC]:).)*)', 1, 1, 'n', 1)) AS B,
  TRIM(REGEXP_SUBSTR(content_clob, '<br />\s*<b>\s*C:\s*</b>\s*<br />\s*((?:(?!<br />\s*<b>\s*[ABC]:).)*)', 1, 1, 'n', 1)) AS C
FROM test_table;

内容的提问来源于stack exchange,提问作者Jim Burnell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 19:53:17