Oracle regexp - 从字符串中删除尾随下划线和数字

时间:2011-09-07 12:05:19

标签: regex oracle

我有这样的价值观: aaa_1,bb_5,c_21,a_b。 现在我需要从这个值中删除尾随下划线和数字。 A_b(string_string)是有效值,无需删除。基本上,我需要regexp patern从字符串中仅提取尾随_ [任意位数]。

我正在使用Oracle 11gR2

有什么建议吗?

2 个答案:

答案 0 :(得分:4)

你需要使用REGEXP_REPLACE和正则表达式'\ _ [[:digit:]] {1,}'

这转换为找到(转义)下划线后面带有一个或多个数字:

e.g。

SELECT REGEXP_REPLACE('a_b', '\_[[:digit:]]{1,}'),
       REGEXP_REPLACE('aaa_1', '\_[[:digit:]]{1,}'),
       REGEXP_REPLACE('c_21', '\_[[:digit:]]{1,}'),
       REGEXP_REPLACE('bb_5', '\_[[:digit:]]{1,}')
  FROM dual;

返回

a_b
aaa
c
bb

如果你想确保在没有字母字符时只删除下划线和数字,那么将$添加到正则表达式字符串的末尾以表示字符串的结尾。

e.g。首先是没有

的“$”秒
SELECT REGEXP_REPLACE('bb_5b', '\_[[:digit:]]{1,}$'),
       REGEXP_REPLACE('bb_5b', '\_[[:digit:]]{1,}'),
       REGEXP_REPLACE('bb_55', '\_[[:digit:]]{1,}$'),
       REGEXP_REPLACE('bb_55', '\_[[:digit:]]{1,}')
  FROM dual;

返回

bb_5b
bbb
bb
bb

正则表达式可能很笨拙,但这个链接是我发现的Oracle正则表达式中最容易理解的链接之一: http://www.dba-oracle.com/t_regular_expressions.htm

希望这有帮助。

答案 1 :(得分:0)

这是另一个版本,如果你有数字,它将忽略任何以数字开头的值。与Ollie相同的基本方法,但考虑到值的第一部分,以确保它们是字母。它捕获值的两个部分,如果符合您的标准,则将其替换为第一部分。

select
  regexp_replace('A_1', '([A-Za-z]+)(\_\d+)', '\1'),
  regexp_replace('A_B', '([A-Za-z]+)(\_\d+)', '\1'),
  regexp_replace('cc_21', '([A-Za-z]+)(\_\d+)', '\1'),
  regexp_replace('1_1', '([A-Za-z]+)(\_\d+)', '\1')
 from dual;