Oracle 需要使用REGEXP\u SUBSTR提取文本-找不到正确的组合

Oracle 需要使用REGEXP\u SUBSTR提取文本-找不到正确的组合,oracle,netsuite,Oracle,Netsuite,以下是我的文本示例-我正在尝试获取TEXTPART3作为答案: TEXTPART1:TEXTPART2:TEXTPART3-TEXTPART4 我使用了TRIM(从REGEXP_SUBSTR('textstatementhere',':.+?-')开始的“:”),但它没有考虑到文本语句中的两个“:”和“-”,我得到了“TEXTPART2:TEXTPART3-” 有人能帮忙吗 提前谢谢 利用REGEXP\u SUBSTR函数完成所有工作 使用子表达式,(\w),并引用它: WITH exmple

以下是我的文本示例-我正在尝试获取TEXTPART3作为答案:

TEXTPART1:TEXTPART2:TEXTPART3-TEXTPART4

我使用了TRIM(从REGEXP_SUBSTR('textstatementhere',':.+?-')开始的“:”),但它没有考虑到文本语句中的两个“:”和“-”,我得到了“TEXTPART2:TEXTPART3-”

有人能帮忙吗


提前谢谢

利用REGEXP\u 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
(代表字母数字或下划线(u)字符)

您可以将其替换为不匹配的字符列表,以避免出现
问题:

[^::][/code>

该方法如下所示:

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

为什么它必须是“带有REGEXP\u SUBSTR”?解决问题的方法通常不是问题需求的一部分。你的问题有一个没有正则表达式的更有效的解决方案。至少还有一个假设你没有提到:TEXTPART2字符串不包含前面有空格的破折号。类似这样的输入:ABC:DEF-GEH:TEXTPART3-TEXTPART4。也许这种模式在数据中是不可能的,但OP没有明确排除它。是的,同意。谢谢大家,REGEXP_SUBSTR(txt,,:([^:]*)-,1,1,NULL,1)解决了我的问题。。