【问题标题】:Oracle REGEXP_SUBSTR - extract only matched stringOracle REGEXP_SUBSTR - 仅提取匹配的字符串
【发布时间】:2021-12-18 17:40:03
【问题描述】:

例如one > two > three > four > five

word four 应该是结果字符串。

我有这个表达式来匹配所需的输出:(?<=^(\w+\s>\s){3})(\w+)

但它使用以下方法返回空字符串: REGEXP_SUBSTR (t.column, '(?<=^(\w+\s>\s){3})(\w+)').

这里出了什么问题?
谢谢。

注意:以“>”号分隔的字符串可以由两个或多个单词组成。例如: one > two > three > four1 four2 > five 应该返回 four1 four2

【问题讨论】:

    标签: regex oracle


    【解决方案1】:

    如果不必是正则表达式解决方案,请使用substr + instr 组合(result_1)。

    或者,如果它必须是正则表达式,并且如果字符串看起来像您发布的那样,请从中获取第 4 个 word (result_2)。

    select trim(substr(col, instr(col, '>', 1, 3) + 1,
                            instr(col, '>', 1, 4) - instr(col, '>', 1, 3) - 1
                      )) result_1,
           --
           regexp_substr(col, '\w+', 1, 4) result_2
    from your_table;  
    

    【讨论】:

      【解决方案2】:

      您需要将非消费模式转换为消费模式,并使用额外的参数来确保REGEXP_SUBSTR 返回正确的捕获:

      REGEXP_SUBSTR (t.column, '^([^>]+\s+>\s+){3}\s*([^>]*[^[:space:]>])', 1, 1, NULL, 2)
      

      请注意,正则表达式中不再有后视功能,因为您需要第 2 组值,所以最后一个参数设置为 2

      查看Oracle DB fiddle

      SELECT REGEXP_SUBSTR(
          'one > two > three > four or more > five',
          '^([^>]+\s+>\s+){3}\s*([^>]*[^[:space:]>])',
          1, 1, NULL, 2) as Result from dual
      

      输出:

      【讨论】:

      • 感谢您的评论。请看一下已编辑的问题: 注意:以“>”号分隔的字符串可以由两个或多个单词组成。例如:一>二>三>四1四2>五应该返回四1四2-
      • @BitWise 我用否定括号表达式更新了解决方案。
      猜你喜欢
      • 2012-06-26
      • 1970-01-01
      • 2014-08-18
      • 1970-01-01
      • 2016-08-28
      • 1970-01-01
      • 2021-08-04
      • 1970-01-01
      • 2021-04-23
      相关资源
      最近更新 更多