regexp_replace оракула sql

У меня есть таблица с такими значениями.

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.


person Miracle    schedule 11.04.2018    source источник


Ответы (3)


Вы можете попробовать это. Он ищет ., за которым следует символ слова, и заменяет его точкой ., затем пробелом и соответствующим символом.

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

если вы хотите заменить только первое такое вхождение, вы можете указать это.

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

Единственное, что следует отметить, это будет соответствовать числу, алфавиту и подчеркиванию, а если вы не хотите рассматривать "_" , используйте [[:alnum:]] или [a-zA-Z0-9] вместо \w

Демо

person Kaushik Nayak    schedule 11.04.2018

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

person Jay Shankar Gupta    schedule 11.04.2018
comment
Это изменяет abc/123 на abc. 123, что неверно. SQLFIDDLE [/.] будет соответствовать символу / или . — вместо этого вам нужно [.] или \. . Кроме того, вы не хотите использовать REGEXP_LIKE, а затем другое выражение в REGEXP_REPLACE, так как 'abc.123.@/.' будет соответствовать REGEXP_LIKE, а затем REGEXP_SUBSTR изменит его на 'abc. 123. @/. ', что, опять же, неверно. - person MT0; 11.04.2018
comment
извините опечатка - person Jay Shankar Gupta; 11.04.2018
comment
Все еще неверно, так как [\.] будет соответствовать символам \ и . SQLFIDDLE. Кроме того, редактирование ничего не сделало для устранения второй ошибки. - person MT0; 11.04.2018
comment
теперь я думаю, что это правильно @MT0 Спасибо за другой тестовый пример - person Jay Shankar Gupta; 11.04.2018
comment
Все еще неправильно, так как [\.] будет соответствовать символам \ и .. SQLFIDDLE — посмотрите на разницу в последней строке вывода. Вы хотите либо '[.]([a-zA-Z0-9])', либо '\.([a-zA-Z0-9])' в качестве регулярного выражения. - person MT0; 11.04.2018

Вы можете попробовать это.

. — это ключевое слово в регулярном выражении, поэтому перед ним нужно поставить \.

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

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

person D-Shih    schedule 11.04.2018
comment
REGEXP_REPLACE(EXPCOL,'\.\W','.') abc. bc bcd. 23 efg.@/. Ваш вывод неверен, он заменяет 1-й символ после . - person Nishant Gupta; 11.04.2018
comment
Ребята, вы правы :(. Я редактирую свой ответ. Мне очень жаль. - person D-Shih; 11.04.2018