这就是我要怎么做。请注意以下几点:
这是我们如何重新创建您的数据的方法。当您在此处提出问题时,这就是您应该如何提供示例数据-而不是我们无法在SQL编辑器中复制和粘贴的图像。
CREATE TABLE sample_data( col_a varchar2(20), col_b CLOB );
INSERT INTO sample_data VALUES
('12345', to_clob(
'Created:2/28/2019
Updated:1/19/2021
LIST:[ABC][DEF][GHI]
[LMNO][PQRST]
[Location=BLAH].[City=BLAH]'));
INSERT INTO sample_data VALUES
('12346', to_clob(
'Created:2/28/2019
Updated:1/19/2021
LIST:[ABC][DEF][GHI]
[LMNO][PQRST]
[SOC].[RAW]'));
commit;
然后是查询和输出。请注意,根据您的界面(在我的例子中是:SQL Developer,它使用类似SQL * Plus的界面),您可能需要更改一些设置,以便输出不会被截断。特别是在SQL * Plus中,默认情况下,CLOB列被截断为80个字符;我不得不
set long 100
所以-查询和输出:
select col_a, col_b,
regexp_substr(col_b, '(\s|^)(LIST:[^.]*?)\s+\S+\.', 1, 1, null, 2)
as result
from sample_data
;
COL_A COL_B RESULT
----- ------------------------------ ------------------------------
12345 Created:2/28/2019 LIST:[ABC][DEF][GHI]
Updated:1/19/2021 [LMNO][PQRST]
LIST:[ABC][DEF][GHI]
[LMNO][PQRST]
[Location=BLAH].[City=BLAH]
12346 Created:2/28/2019 LIST:[ABC][DEF][GHI]
Updated:1/19/2021 [LMNO][PQRST]
LIST:[ABC][DEF][GHI]
[LMNO][PQRST]
[SOC].[RAW]
正则表达式匹配单个空格字符或字符串((\s|^)
)的开头,然后匹配允许匹配的所需字符,LIST:
其后是最少几个连续的非周期字符(特别是将匹配空格和换行符),以允许匹配-继续一个或多个空白字符,后跟一个单词(1个或多个非空白字符的字符串)和文字句号(\.
)。
我们必须返回的表达式用括号括起来,以便我们可以从返回regexp_substr
。这样的表达称为“捕获组”。正则表达式(\s|^)
出于必要(替代)包括另一个捕获组,因此我们必须返回的捕获组是正则表达式中的第二个捕获组。这是最后一个参数要regexp_substr
执行的操作:它指示函数返回第二个捕获组。
请注意有关句号的一个特殊情况(与括号表达式中转义的更一般的概念有关):必须转义句号以表示正则表达式的句号,而不是“任何字符”;但是,在(否定的)方括号表达式中[^.]*?
,不能转义代表文字期间而不是“任何字符”的句点。Oracle遵循POSIX标准的ERE(扩展正则表达式)方言,该标准说,转义序列在方括号表达式中无效。这与其他正则表达式方言不同,并且使很多用户感到困惑。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句