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
相关产品推荐
相关产品推荐

