如何修改PL/SQL正则表达式,保留字段最后一个换行并替换中间换行?
SQL数据格式调整:保留最后一个换行,替换中间换行为空格
问题需求
将Sample_Table表的DESCRIPTION字段内容处理为:字段值内的中间换行替换为空格,仅保留最后一个换行。生成Insert语句时效果如下:
原Insert语句:
Insert into Sample_Table (DESCRIPTION) Values ('This is example test TEST');
预期Insert语句:
Insert into Sample_Table (DESCRIPTION) Values ('This is example test TEST');
现有PL/SQL代码未实现预期效果,需修改:
DECLARE CURSOR chk_for_bad_data IS SELECT description FROM Sample_Table WHERE REGEXP_LIKE (replace(replace(description,chr(10), ';'), CHR(09), ';'), '[^[:print:]]', 'x'); BEGIN FOR get_bad_data IN chk_for_bad_data LOOP UPDATE Sample_Table SET description = regexp_replace(description, '(.*)(\r?\n)+$', '\1\r\n'); WHERE descriptio = get_bad_data.description END LOOP; END;
解决方案
可以通过正则表达式实现需求,核心是精准区分中间换行和末尾换行。修改后的PL/SQL代码如下:
DECLARE CURSOR chk_for_bad_data IS SELECT description FROM Sample_Table WHERE REGEXP_LIKE(replace(replace(description, CHR(10), ';'), CHR(09), ';'), '[^[:print:]]', 'x'); BEGIN FOR get_bad_data IN chk_for_bad_data LOOP UPDATE Sample_Table SET description = -- 替换所有非末尾的换行符为空格,再确保末尾保留一个标准换行 REGEXP_REPLACE( REGEXP_REPLACE(get_bad_data.description, '(\r?\n)(?!$)', ' '), '(.*)(\r?\n)?$', '\1' || CHR(13) || CHR(10) ) WHERE description = get_bad_data.description; -- 修正原代码拼写错误 END LOOP; COMMIT; -- 提交事务使更新生效 END; /
关键逻辑说明
- 第一步正则替换:
'(\r?\n)(?!$)'使用负向断言(?!$),匹配所有不在字符串末尾的换行符(兼容\n和\r\n格式),替换为空格,这一步处理所有中间换行。 - 第二步正则替换:
'(.*)(\r?\n)?$'捕获字段全部内容,无论原末尾是否有换行,都统一添加标准的\r\n换行,确保最后仅保留一个换行。 - 修正了原代码中的拼写错误
descriptio→description,避免执行报错。 - 新增
COMMIT语句,确保更新操作持久化。
简化场景版
如果可以确认所有DESCRIPTION字段末尾原本就存在换行,可简化为一步替换:
SET description = REGEXP_REPLACE(get_bad_data.description, '(\r?\n)(?!.*\r?\n)', ' ')
该正则匹配所有后续仍有换行的换行符(即中间换行),直接替换为空格,最后一个换行因后续无其他换行,会被保留。
内容的提问来源于stack exchange,提问作者Quest09
相关产品推荐
相关产品推荐

