需要使用 REGEXP_SUBSTR 提取文本 - 找不到正确的组合
Need to extract text with REGEXP_SUBSTR - cannot find the right combination
这是我的文本示例 - 我正在尝试将 TEXTPART3 作为答案:
TEXTPART1 : TEXTPART2: TEXTPART3 - TEXTPART4
我使用了 TRIM(LEADING ':' FROM REGEXP_SUBSTR('textstatementhere', ':.+?-')) - 但它不考虑两个“: " 和文本语句中的 "-" 我得到 ' TEXTPART2: TEXTPART3 -'
有人可以帮忙吗?
提前致谢!
利用 REGEXP_SUBSTR 功能完成您的所有工作
使用子表达式,(\w)
,并引用它:
WITH exmple AS (
SELECT
'TEXTPART1 : TEXTPART2: TEXTPART3 - TEXTPART4' txt
FROM
dual
)
SELECT
txt,
regexp_substr(txt, ': (\w*) -', 1, 1, NULL,
1)
FROM
exmple;
我看到您使用 .
代替 \w
。因为您选择了元字符,.
(它代表除换行符之外的所有字符(尽管如果将“n”设置为模式匹配修饰符,则可以包括在内)),第二个冒号被放入匹配设置。
TEXTPART3 包括什么?
也许元字符 \w
(代表字母数字或下划线 (_) 字符)不是您需要的。
您可以将其替换为不匹配的字符列表,以避免出现 .
:
的问题
[^:]
.
这种方法看起来像这样:
REGEXP_SUBSTR(txt, ': ([^:]*) -',1,1,NULL,1)
最后,对于与此子表达式关联的量词,我使用了 *
,这意味着零个或多个匹配项。我假设在某些情况下,此 TEXTPART3 的匹配项可能为零。如果不是这种情况,我们可以使用 +
.
该问题有仅使用标准字符串函数的更有效的解决方案:
with
sample_input (str) as (
select 'TEXTPART1 : TEXTPART2: TEXTPART3 - TEXTPART4' from dual
)
select substr(str, pos, instr(str, '-', pos) - pos - 1) as text_part_3
from (select str, instr(str, ':', 1, 2) + 2 as pos from sample_input)
;
TEXT_PART_3
-----------
TEXTPART3
这是我的文本示例 - 我正在尝试将 TEXTPART3 作为答案:
TEXTPART1 : TEXTPART2: TEXTPART3 - TEXTPART4
我使用了 TRIM(LEADING ':' FROM REGEXP_SUBSTR('textstatementhere', ':.+?-')) - 但它不考虑两个“: " 和文本语句中的 "-" 我得到 ' TEXTPART2: TEXTPART3 -'
有人可以帮忙吗?
提前致谢!
利用 REGEXP_SUBSTR 功能完成您的所有工作
使用子表达式,(\w)
,并引用它:
WITH exmple AS (
SELECT
'TEXTPART1 : TEXTPART2: TEXTPART3 - TEXTPART4' txt
FROM
dual
)
SELECT
txt,
regexp_substr(txt, ': (\w*) -', 1, 1, NULL,
1)
FROM
exmple;
我看到您使用 .
代替 \w
。因为您选择了元字符,.
(它代表除换行符之外的所有字符(尽管如果将“n”设置为模式匹配修饰符,则可以包括在内)),第二个冒号被放入匹配设置。
TEXTPART3 包括什么?
也许元字符 \w
(代表字母数字或下划线 (_) 字符)不是您需要的。
您可以将其替换为不匹配的字符列表,以避免出现 .
:
[^:]
.
这种方法看起来像这样:
REGEXP_SUBSTR(txt, ': ([^:]*) -',1,1,NULL,1)
最后,对于与此子表达式关联的量词,我使用了 *
,这意味着零个或多个匹配项。我假设在某些情况下,此 TEXTPART3 的匹配项可能为零。如果不是这种情况,我们可以使用 +
.
该问题有仅使用标准字符串函数的更有效的解决方案:
with
sample_input (str) as (
select 'TEXTPART1 : TEXTPART2: TEXTPART3 - TEXTPART4' from dual
)
select substr(str, pos, instr(str, '-', pos) - pos - 1) as text_part_3
from (select str, instr(str, ':', 1, 2) + 2 as pos from sample_input)
;
TEXT_PART_3
-----------
TEXTPART3