需要使用 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