【问题标题】:Use REGEXP_SUBSTR like a Split function像拆分函数一样使用 REGEXP_SUBSTR
【发布时间】:2012-03-14 00:40:55
【问题描述】:

我需要从 VARCHAR2 列中的数据中提取文本值。示例:

EDKES^Visit: ^PRIMARY INSURANCE COMMENTS: ^SECONDARY INSURANCE COMMENTS: ^TERTIARY INSURANCE COMMENTS: ^NO PRIMARY INSURANCE^NONE^NONE^NONE^NONE^NONE^NONE^NONE^NONE^NONE^NO SECONDARY INSURANCE^NONE^NONE^NONE^NONE^NONE^NONE^NONE^NONE^NONE^NO TERTIARY INS*

我需要获取第 6 次出现“^”的文本(不包括“^”)。在本例中,文本为NO PRIMARY INSURANCE

([\w\s\:\*]+(\^?)) 大多有效,但不排除 '^'。

当我尝试使用此表达式 REGEXP_SUBSTR(VARCHAR_COL, '([\w\s\:\*]+(\^?))', 1, 6) 时,我得到一个字符 ('s'),而不是预期的匹配 NO PRIMARY INSURANCE^

我错过了什么?

【问题讨论】:

    标签: regex oracle10g


    【解决方案1】:

    这应该很好用:

    REPLACE(REGEXP_SUBSTR(VARCHAR_COL, '[^^]+\^?', 1, 6), '^', '')
    

    【讨论】:

    • '^^' 表示除'^' 之外的所有字符吗?
    • @craig 没错,但仅在用作字符类时:[^^]。单独使用 ^^ 它匹配字符串的开头(两次)。
    • 如果位置没有值,则表达式无法按预期工作。例如,将您建议的正则表达式应用于ONE^TWO^THREE^^FIVE^SIX^SEVEN 将返回SEVEN,当我需要它返回SIX 时。你能推荐一个解决方案吗?
    • 有趣的是,[^^]+\^?? 会从结果中消除^,因此不需要REPLACE 函数。
    • @craig 试试'[^^]*\^?'+ 至少需要一个字符,* 使其可选。我无法测试它,但它应该可以工作。
    【解决方案2】:

    您也可以考虑空白列。如果引擎只返回
    捕获组,它将修剪分隔符。

    ([^^]*).?

    这当然意味着找到的最后一列总是无效的。

    【讨论】:

    • 是的,看起来它仅限于 POSIX 样式。没有环顾四周。如果您确定没有空白字段(即^^^this^that^^),您应该可以使用[^^]+,这会修剪分隔符,但它不会接受空白字段。
    猜你喜欢
    • 2017-10-08
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多