从Oracle中的String中提取特定数据集

问题描述 投票:1回答:2

我有字符串'1_A_B_C_D_E_1_2_3_4_5',我正在尝试提取数据'A_B_C_D_E'。我想从字符串中删除_1_2_3_4_5和1_部分。这本质上是字符串中的数字部分。还必须删除最后一个字母后的任何特殊字符。在此示例中,字符E之后的_也必须不存在。

我正在尝试的查询如下

SELECT 
REGEXP_SUBSTR('1_A_B_C_D_E_1_2_3_4_5','[^0-9]+',1,1) 
from dual

我从上述查询得到的数据如下: -

_A_B_C_D_E_

我试图找到一种方法来删除最后的下划线。任何其他方式来解决这个问题?

sql string oracle regexp-replace regexp-substr
2个回答
2
投票

假设首先出现“字母”然后是“数字”,你可以这样做:

select regexp_substr('A_B_C_D_E_1_2_3_4_5','.*[A-Z]') from dual;

这将从字符串的开头拉出所有字符,直到字符串中的最后一个大写字母(.*是贪婪的,它将尽可能地延伸,同时仍然允许再一个大写字母来完成匹配)。


0
投票

我有字符串'1_A_B_C_D_E_1_2_3_4_5',我正在尝试提取数据'A_B_C_D_E'

使用REGEXP_REPLACE:

SQL> SELECT trim(BOTH '_' FROM
  2         (REGEXP_SUBSTR('1_A_B_C_D_E_1_2_3_4_5','[0-9]+', ''))) str
  3  FROM dual;

STR
---------
A_B_C_D_E

这个怎么运作:

  1. REGEXP_REPLACE将从字符串中替换所有数字出现'[0-9] +'。或者,您也可以使用POSIX字符类'[^ [:digit:]] +'
  2. TRIM BOTH '_'将从字符串中删除任何领先和滞后的_

还使用REGEXP_SUBSTR:

SELECT trim(BOTH '_' FROM 
       (REGEXP_SUBSTR('1_A_B_C_D_E_1_2_3_4_5','[^0-9]+'))) str 
FROM dual;
STR
---------
A_B_C_D_E
© www.soinside.com 2019 - 2024. All rights reserved.