从 Oracle 中的字符串中提取特定的数据集

Extract Specific Set of data from a String in Oracle

我有字符串'1_A_B_C_D_E_1_2_3_4_5',我正在尝试提取数据'A_B_C_D_E '.我正在尝试从字符串中删除 _1_2_3_4_51_ 部分。这实际上是字符串中的数字部分。最后一个字母表之后的任何特殊字符也必须删除。在此示例中,字符 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_

我正在想办法在最后删除下划线。还有其他方法可以解决这个问题吗?

假设 "letters" 先出现,然后 "digits",你可以这样做:

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

这将从字符串的开头提取所有字符,直到字符串中的最后一个 upper-case 字母(.* 是贪婪的,它会尽可能地扩展,同时仍然允许再收到 upper-case 封信来完成比赛)。

I have the string '1_A_B_C_D_E_1_2_3_4_5' and I am trying to extract the data '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 字符 class '[^[: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