我有字符串' 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_
我正试图找到一种方法来删除最后的下划线。还有其他方法可以解决这个问题吗?
答案 0 :(得分:2)
假设"字母"先来,然后是"数字",你可以这样做:
select regexp_substr('A_B_C_D_E_1_2_3_4_5','.*[A-Z]') from dual;
这将从字符串的开头拉出所有字符,直到字符串中的最后一个大写字母(.*
是贪婪的,它将尽可能地延伸,同时仍然允许另一个上层-case来完成比赛。)
答案 1 :(得分:1)
我有字符串' 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
工作原理:
REGEXP_REPLACE
将从字符串中替换所有数字出现' [0-9] +' 。或者,您也可以使用POSIX字符类' [^ [:digit:]] +' 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