【问题标题】:How to apply `REGEXP_SUBSTR` to extract specific substring from string?如何应用 `REGEXP_SUBSTR` 从字符串中提取特定子字符串?
【发布时间】:2022-01-19 16:49:10
【问题描述】:

我有以下字符串011/2020-PL00-70-31(它可能略有不同,例如011/2020-PL00-70-3 或011/2020-PL00-70-310)。我需要从字符串中提取最后一个- 之前的所有字符串。由于REGEXP_SUBSTR 的011/2020-PL00-70-310 我只需要得到011/2020-PL00-70,即没有最后4 个符号(但在某些情况下它可能没有2 或3 个符号)。

我是 PL SQL 中的正则表达式的新手,如果这么简单,很抱歉。

非常感谢。

【问题讨论】:

  • 你可以试试REGEXP_REPLACE(whatever, '(-[^-]+)$', '')。
  • 表达式REGEXP_REPLACE(whatever, '(-[^-]+)$') 找到-31,但不删除。我无法申请 replace,因为字符串中可能还有 -31 的匹配项。
  • 它应该找到一个减号,后跟至少一个非减号 - 但 only 在字符串的 end ($!) ,因此任何中间事件都应保持不变。
  • @Aconcagua,请发表您的评论作为答案。这是正确的解决方案。
  • @AnkitBajpai 已添加 - 之前没有发布,因为我没有测试过......

标签: sql oracle regexp-substr


【解决方案1】:

您可以使用正则表达式捕获组() 仅从模式中获取您需要的部分。

SELECT REGEXP_SUBSTR(sample, '^(.*)-\d+$',1,1,'',1) AS sample2
FROM sample_table
SAMPLE2
011/2020-PL00-70
011/2020-PL00-70
011/202-PL00-70

dbfiddle here

上的演示

正则表达式模式here的测试

【讨论】:

    【解决方案2】:

    在这种特殊情况下,我认为您对使用正则表达式的解决方案进行了过度思考。您的连字符始终是第三个连字符,因此您只需使用 INSTR 即可找到第三个连字符。在此处查看此查询:

    SELECT SUBSTR(sample, 1, INSTR(sample, '-', 1, 3)-1) AS match
    FROM sample_table;
    

    我已将我的结果与 SQLFiddle - http://sqlfiddle.com/#!4/c30207/7/0

    相关联

    【讨论】:

      【解决方案3】:

      你可以直接替换掉后面的数字:

      REGEXP_REPLACE(whatever, '(-[^-]+)$', '')
      

      正则表达式捕获减号和任何后续的非减号字符([^-]+;或者您可以仅匹配数字:\d+)- 如果它们位于字符串 ($),因此中间数字受到保护。

      【讨论】:

        猜你喜欢
        • 2019-10-26
        • 1970-01-01
        • 1970-01-01
        • 2017-12-04
        • 1970-01-01
        • 1970-01-01
        • 2011-11-17
        • 1970-01-01
        • 2012-06-26
        相关资源
        最近更新 更多