我有这样的价值观: aaa_1,bb_5,c_21,a_b。 现在我需要从这个值中删除尾随下划线和数字。 A_b(string_string)是有效值,无需删除。基本上,我需要regexp patern从字符串中仅提取尾随_ [任意位数]。
我正在使用Oracle 11gR2
有什么建议吗?
答案 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;