我在Oracle中有以下字符串作为一个连续的行,而不是将此信息显示为一个连续的字符串,我实际上想要在出现“:F”和“:L之前附加一个回车符/换行符“,这也需要在F和L之前删除”:“
当前字符串:
F:AA BB:F:BB CC dd:F:ZZ Xx Y:L:Hello:F:Goodbye
新显示的字符串:
F:AA BB
F:BB CC dd
F:ZZ Xx Y
L:Hello
F:Goodbye
尝试在Oracle pl / sql中将其作为一个简洁的函数来实现,这样我就可以传入当前字符串并返回带有回车符/新换行符的新字符串。
答案 0 :(得分:7)
我认为你不需要正则表达式。简单的替换应该可以解决问题。
new_val := REPLACE( REPLACE( string_val, ':F:', CHR(10)||'F:' )
, ':L:', CHR(10)||'L:' );
这给了unix风格的新线条。如果您想要Windows换行符,则需要使用CHR(13)||CHR(10)
而不是CHR(10)
。
你也可以在查询中使用它。
答案 1 :(得分:1)
只是以regular expression replace方式投掷:
with TestData as(
select 'F:AA BB:F:BB CC dd:F:ZZ Xx Y:L:Hello:F:Goodbye' text from dual
)
select testData.text ,
REGEXP_REPLACE(testData.text, '(:)([F|L]+:)',CHR(13)||CHR(10) || '\2') REG_REP
from testData
;
TEXT REG_REP
---------------------------------------------- -----------
F:AA BB:F:BB CC dd:F:ZZ Xx Y:L:Hello:F:Goodbye F:AA BB
F:BB CC dd
F:ZZ Xx Y
L:Hello
F:Goodbye
REGEXP_REPLACE(testData.text, '(:)([F|L]+:)',CHR(13)||CHR(10) || '\2')
()标记分组可能是替换为\ GroupPosition#
的引用(:)([F|L]+:)
几乎是在说a:然后是F:或L:
CHR(13)||CHR(10) || '\2'
然后用“CHR(13)|| CHR(10)||”替换找到的文本+第二组
答案 2 :(得分:0)
使用regexp:
select REGEXP_REPLACE('F:AA BB:F:BB CC dd:F:ZZ Xx Y:L:Hello:F:Goodbye',
(\:+)(F|L{1})(\:+)',
chr(13)||chr(10)||'\2\3')
from dual;
更符合模式。