2014-12-02 48 views
0

嗨如果以数字开头,我想要将字母C附加到字符串。 此外,如果有任何标点然后用下划线代替_ 例如:5-2-2-1 ==> C5_2_2_1Oracle Regexp_replace多次出现

我试过了,但我不能够取代标点符号的多次出现。我错过了一些简单的事情,我无法得到它。

SELECT REGEXP_REPLACE('9-1-1','^(\d)(-),'C\1_') FROM DUAL; 

回答

1

试试这个:

select (case when substr(val, 1, 1) between '0' and '9' then 'C' else '' end) || 
     regexp_replace(val, '([-+.,;:'"!])', '_') 
+0

非常感谢您的快速回复!!只是出于好奇,如果有一种方法可以在一次正则表达式函数 – 2014-12-02 22:41:07

+0

@RajA。 。 。我不认为有一种方法可以用一种功能来做到这一点。 – 2014-12-02 22:50:43

+0

..嗯,我在想,如果无论如何,我们可以捕捉到不止一个角色的发生......但是它没关系,我会用这个..再次感谢 – 2014-12-02 22:52:52

2
SELECT case when REGEXP_LIKE('9-1-1','^[[:digit:]]') then 'C' END 
     || REGEXP_REPLACE('9-1-1', '[[:punct:]]', '_') 
FROM DUAL; 

[:digit:]任何数字
[:punct:]标点符号

,如果你有很多不同值的行,然后尽量避免正则表达式:这里

SELECT case when substr('9-1-1',1,1) between '0' and '9' then 'C' end 
     || translate('9-1-1', ',.!-', '_') 
FROM DUAL; 

检查,例如: Performance of regexp_replace vs translate in Oracle?

+0

非常感谢它!我只是想尽量减少多个功能,因为我会通过数百万行扫描这个 – 2014-12-02 22:39:17

+0

@Raj A我已经添加了一些更多的信息。我不知道数百万行 – Multisync 2014-12-02 22:59:48

+0

非常感谢您的努力和链接! – 2014-12-02 23:00:57