【问题标题】:How to split strings using two delimiter in Oracle 11g regexp_substr functions如何在 Oracle 11g regexp_substr 函数中使用两个分隔符拆分字符串
【发布时间】:2017-09-24 19:10:42
【问题描述】:

我怀疑使用分隔符分割字符串。

首先拆分基于,分隔符选择那些拆分的字符串应该基于-分隔符拆分

我的原始字符串:UMC12I-1234,CSM3-123,VQ, 预期输出:

UMC12I
CSM3
VQ

每个值都以行值的形式出现

我试过了

WITH fab_sites AS (
  SELECT trim(regexp_substr('UMC12I-1234,CSM3-123,VQ,', '[^,]+', 1, LEVEL)) fab_site
  FROM dual
  CONNECT BY LEVEL <= regexp_count('UMC12I-1234,CSM3-123,VQ,', '[^,]+')+1
)
SELECT fab_site FROM   fab_sites WHERE fab_site IS NOT NULL

-- 根据 , 分隔符分割

输出是:

UMC12I-1234
CSM3-123
VQ

我怎样才能得到我的预期输出? (需要再次拆分 - 分隔符)

【问题讨论】:

    标签: regex oracle11gr2 regexp-substr


    【解决方案1】:

    您可以使用regexp_substr 提取- 之前的“单词”

    ([^,-]+)(-[^,-]+)?
    

    该模式将匹配并捕获到第 1 组中除,- 之外的一个或多个字符,然后将匹配- 的可选序列和除@ 之外的1+ 个字符987654330@和-

    请参阅regex demo

    在上面的正则表达式中使用这个regex_substr 行而不是你的行:

    SELECT trim(regexp_substr('UMC12I-1234,CSM3-123,VQ,', '([^,-]+)(-[^,-]+)?', 1, LEVEL, NULL, 1)) fab_site
    

    online demo

    【讨论】:

    • 可能你的第二个链接有问题:在线演示
    • @k-five:在蜗牛笔记本电脑上打字通常会导致这样的“错别字”。应该是rextester.com/QBE60576
    【解决方案2】:

    你可以试试这个查询:

    WITH fab_sites AS (
          SELECT TRIM(',' FROM REGEXP_SUBSTR('UMC12I-1234,CSM3-123,VQ,', '(^|,)[^,-]+', 1, LEVEL)) fab_site
            FROM dual
         CONNECT BY LEVEL <= REGEXP_COUNT('UMC12I-1234,CSM3-123,VQ,', '(^|,)[^,-]+')
    )
    SELECT fab_site
      FROM fab_sites;
    

    我们首先匹配任何以整个字符串开头^ 或逗号,(分隔符)开头的子字符串。然后我们得到所有既不匹配逗号也不匹配破折号-的字符。一旦我们有了那个子字符串,我们就会从中删除任何剩余的逗号。

    附:我认为CONNECT BY 子句中的+1 是无关紧要的,“外部”查询中的WHERE NOT NULL 也是如此。

    【讨论】:

      猜你喜欢
      • 2015-10-17
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      • 2018-01-06
      • 1970-01-01
      • 2016-04-06
      • 2020-04-11
      • 1970-01-01
      相关资源
      最近更新 更多