【问题标题】:Substring Regular Expression for occurence出现的子字符串正则表达式
【发布时间】:2019-10-17 03:36:36
【问题描述】:

我想选择出现在第一个下划线 _ 之后和第二个、第三个或任何数量的下划线 _ 出现在字符串中的部分字符串。

例如我有这样的字符串:

75618_LORIK1_2_BABA_ODD_GENERIC
19_GENTRIT3_CC_DD_FF_BROWSERTC
75618_BETIM2

输出应该是:

LORIK1
GENTRIT3
BETIM2

我似乎无法找到某种子字符串的表达式来获取该部分,我尝试使用:

SELECT SUBSTR(COLNAME, 0, INSTR(COLNAME, '_')-1) FROM DUAL;

但它似乎只得到第一次出现'_'之前的部分。

【问题讨论】:

  • 您所说的“在第二个、第三个或其他...之前”是什么意思?这是没有意义的。您的意思是“在第二个下划线之前,或者如果只有一个下划线,则到字符串的末尾”?然后 - 如果整个字符串中没有下划线怎么办?最后,是否需要使用正则表达式?这不是解决这个问题的最有效方法。
  • @mathguy 我知道字符串永远不会只有 _,如示例中所示的字符串格式,我已经显示了输出。据我所知,有两种方法可以解决这个问题,使用 Substr Instr 的组合或通过我不知道如何使用的正则表达式......

标签: sql oracle substring


【解决方案1】:

这是使用正则表达式执行此操作的一种方法。

with
  test_data (str) as (
    select '75618_LORIK1_2_BABA_ODD_GENERIC' from dual union all
    select '19_GENTRIT3_CC_DD_FF_BROWSERTC'  from dual union all
    select '75618_BETIM2'                    from dual union all
    select 'NO UNDERLINES HERE'              from dual
  )
select str, regexp_substr(str, '[^_]*', 1, 3) as second_token
from   test_data
;

STR                             SECOND_TOKEN                   
------------------------------- -------------------------------
75618_LORIK1_2_BABA_ODD_GENERIC LORIK1                         
19_GENTRIT3_CC_DD_FF_BROWSERTC  GENTRIT3                       
75618_BETIM2                    BETIM2                         
NO UNDERLINES HERE 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 2021-09-19
    相关资源
    最近更新 更多