oracle sql regexp_replace

时间:2018-04-11 06:15:31

标签: sql oracle oracle11g regexp-replace

我有一个像这样的值的表。

ExpTable

+--------+   
|expCol  | 
+--------+
|abc.abc |
|bcd.123 |
|efg.@/. |
+--------+

而我想要的是,当句点后面的字符是字母或数字时,输出会在点之后添加一个空格,如下所示:

预期输出

+--------+   
|expCol  | 
+--------+
|abc. abc|
|bcd. 123|
|efg.@/. | --the value here stays the same because after the period is not a letter/number
+--------+

我试过了:

SELECT REGEXP_REPLACE(expCol, '.', '. ') from expTable WHERE /*condition*/

正如预期的那样,包括最后一个价值' efg。@ /。'在这期间之后有一个空间。我不知道在WHERE子句中放什么。

3 个答案:

答案 0 :(得分:3)

SELECT REGEXP_REPLACE(expCol, '\.([a-zA-Z0-9])', '. \1') AS expCol FROM expTable

OR

SELECT REGEXP_REPLACE(expCol, '[.]([a-zA-Z0-9])', '. \1') AS expCol FROM expTable

输出

EXPCOL
abc. abc
bcd. 123
efg.@/.

LiveDemo

  

http://sqlfiddle.com/#!4/0a6e0/31

答案 1 :(得分:3)

你可以试试这个。它搜索.后跟一个单词字符,并用点.替换它,然后用空格和匹配的字符替换它。

select REGEXP_REPLACE(expCol, '\.(\w)','. \1') FROM ExpTable;

如果您只希望替换第一个此类事件,则可以指定它。

REGEXP_REPLACE(expCol, '\.(\w)','. \1',1,1) 

唯一需要注意的是,如果您不想考虑"_",请使用[[:alnum:]][a-zA-Z0-9]来匹配数字,字母和下划线\w

Demo

答案 2 :(得分:2)

你可以试试这个。

.是正则表达式中的关键字,因此您需要将\放在其前面

SELECT REGEXP_REPLACE(expCol, '\.(\w)', '. \1') from T

sqlfiddle:http://sqlfiddle.com/#!4/94ffec/1