Регулярное выражение Oracle без пробелов

Мне нужно заменить все места без пробела между двумя словами, где первое из них оканчивается точкой, на эти два слова с пробелом между ними.

Например, у меня есть строка типа 'num.some', и мне нужно 'num. some'

Но если у меня 'num. some', мне не нужно 'num. some' (‹-это 2 пробела)

А если у меня '123.4', я тоже не хочу '123. 4' А если у меня '123.some', мне нужно '123. some'

Я пробовал разные комбинации регулярных выражений, но всегда что-то не так с моими ответами.


person Community    schedule 27.10.2016    source источник
comment
Сообщите, пожалуйста, о том, что вы пробовали до сих пор, и о проблемах, которые у вас возникли   -  person Aleksej    schedule 27.10.2016
comment
Не могли бы вы иметь some.123 в данных, и нужно ли также добавить пробел?   -  person mathguy    schedule 27.10.2016


Ответы (3)


Что-то вроде этого может вам помочь:

WITH examples AS (
  SELECT 'num.some' str FROM dual
  UNION 
  SELECT 'num. some' str FROM dual
  UNION 
  SELECT '123.4' str FROM dual
  UNION 
  SELECT '123.some' str FROM dual
)
SELECT str, REGEXP_REPLACE(str,'([a-zA-Z0-9]+)\.([a-zA-Z]+)','\1. \2') replaced
FROM examples

Это ищет точку после буквы, за которой следует буква без пробела.

person pablomatico    schedule 27.10.2016
comment
это повторяется два раза по второму слову (слово после.) У меня было «дол.США», а это до «дол.США». США 'Я не понимаю, почему? - person ; 27.10.2016
comment
@AnastasiaSisordia у меня тоже работает с dol.USA - person pablomatico; 28.10.2016

Это ищет все комбинации (letter.letter, letter.digit, digit.letter) и добавляет пробел после. оставив цифру. цифру без изменений.

with
     inputs ( str ) as (
       select 'ab.sw'  from dual union all
       select 'ab. sw' from dual union all
       select '12.33'  from dual union all
       select '12. 33' from dual union all
       select 'ab.123' from dual union all
       select '1. ab'  from dual union all
       select '1.abc'  from dual
     )
-- END test data. Solution (SQL query) begins below this line.
select str, regexp_replace(str, 
          '(([[:alpha:]]\.)([[:alpha:]])|([[:alpha:]]\.)(\d)|(\d\.)([[:alpha:]]))',
          '\2\4\6 \3\5\7') as new_str
from   inputs
;


STR     NEW_STR
------  -------
ab.sw   ab. sw
ab. sw  ab. sw
12.33   12.33
12. 33  12. 33
ab.123  ab. 123
1. ab   1. ab
1.abc   1. abc
person mathguy    schedule 27.10.2016

Возможно, вам не нужно регулярное выражение. Обычный replace() может сослужить вам хорошую службу.

(тестовые данные относительно @mathguy)

with
     inputs ( str ) as (
       select 'ab.sw'  from dual union all
       select 'ab. sw' from dual union all
       select '12.33'  from dual union all
       select '12. 33' from dual union all
       select 'ab.123' from dual union all
       select '1. ab'  from dual union all
       select '1.abc'  from dual
     )
-- END test data. Solution (SQL query) begins below this line.
select replace(
  replace(str, '.', '. ') -- replace all dots by dot+space
, '  '
, ' '
) -- replace all double spaces by a single space
from   inputs
;
person Martin Schapendonk    schedule 27.10.2016