我需要捕获
Detl Code Desc:
和Ftyp Code Desc:
之间的文本
请参阅下面的示例:
Detl Code Desc: CPS Leadership PD Ftyp Code Desc: Flat Fee
Detl Code Desc: CPS Professional Develop. ED Ftyp Code Desc
最好的方法是什么? 我尝试过
regexp_substr
但无法让它工作。
感谢您的帮助。
这是一个使用公共表表达式(CTE)来设置一些测试数据的示例。 这是向您寻求帮助的人提供数据和示例的好方法。 确保包含意外值,例如 NULL 和不完整的数据。您没有指定,所以我假设(危险!)您希望模式在字符串中第一次出现,因此锚定到字符串的开头。 我有一个围绕两个已知字符串之间的数据的捕获组,这就是返回的数据。 注意:如果未找到模式 (ID 4),REGEXP_SUBSTR() 将返回 NULL。 您可能需要根据您的规格来处理此问题。
with tbl(id, str) as (
select 1, 'Detl Code Desc: CPS Leadership PD Ftyp Code Desc: Flat Fee' from dual union all
select 2, 'Detl Code Desc: CPS Professional Develop. ED Ftyp Code Desc' from dual union all
select 3, '' from dual union all
select 4, 'Detl Code Desc: CPS Leadership PD' from dual
)
select id, regexp_substr(str, '^Detl Code Desc: (.*?) *Ftyp Code Desc', 1, 1, null, 1) detail_code_desc
from tbl;
ID DETAIL_CODE_DESC
---------- --------------------------------------------------------------
1 CPS Leadership PD
2 CPS Professional Develop. ED
3
4
4 rows selected.
相反,如果模式不匹配,REGEXP_REPLACE() 将返回原始字符串。 在这里,我将捕获组放在字符串的所有组件周围,并仅返回第二个组件。 也许比较原始字符串和返回的字符串会让您知道在未找到匹配项时如何继续。 这取决于你的规格。一种方法可能比另一种方法更适合您的错误处理。
with tbl(id, str) as (
select 1, 'Detl Code Desc: CPS Leadership PD Ftyp Code Desc: Flat Fee' from dual union all
select 2, 'Detl Code Desc: CPS Professional Develop. ED Ftyp Code Desc' from dual union all
select 3, '' from dual union all
select 4, 'Detl Code Desc: CPS Leadership PD' from dual
)
select id, regexp_replace(str, '^(Detl Code Desc: )(.*?)( *Ftyp Code Desc)', '\2') detail_code_desc
from tbl;
ID DETAIL_CODE_DESC
---------- -----------------------------
1 CPS Leadership PD: Flat Fee
2 CPS Professional Develop. ED
3
4 Detl Code Desc: CPS Leadershi
4 rows selected.
附注 发布时始终显示您的工作以及失败的内容和任何错误消息,这将有助于我们为您提供帮助。