Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Регулярные выражения. Заменить пробелы между словами в квадратных скобках  [new]
Dr_Murdock
Member

Откуда:
Сообщений: 5
Доброго времени суток! Есть к примеру вот такой текст
CREATE TABLE [Orders] (
[Order ID] int NOT NULL
, [Customer ID] nvarchar(5) NOT NULL
, [Employee ID] int NULL
, [Ship Name] nvarchar(40) NULL
, [Ship Address] nvarchar(60) NULL
, [Ship City] nvarchar(15) NULL
, [Ship Region] nvarchar(15) NULL
, [Ship Postal Code] nvarchar(10) NULL
, [Ship Country] nvarchar(15) NULL
, [Ship Via] int NULL
, [Order Date] datetime NULL
, [Required Date] datetime NULL
, [Shipped Date] datetime NULL
, [Freight] money NULL
);
Как можно заменить пробелы на символ? Например: [Order ID] => [Order_ID]?
Пока додумался только до такого:" select regexp_replace(upper(t.pole),'(\[\w+)[ ]?([^ ]*) (\w+\])','\1_\2_\3') from pnv.clobs;"
Но если будет 4 слова? Если 2 слова, то подчеркивание двойное.
Заранее благодарен за помощь.
23 янв 13, 14:34    [13815546]     Ответить | Цитировать Сообщить модератору
 Re: Регулярные выражения. Заменить пробелы между словами в квадратных скобках  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Dr_Murdock,

вообще, регулярус для сабж. не очень подходит (имхо)
11.2+
with t(s) as (select 'CREATE TABLE [Orders] (
[Order ID] int NOT NULL
, [Customer ID bla bla bla] nvarchar(5) NOT NULL
, [Employee ID] int NULL
, [Ship Name] nvarchar(40) NULL
, [Ship Address] nvarchar(60) NULL
, [Ship City] nvarchar(15) NULL
, [Ship Region] nvarchar(15) NULL
, [Ship Postal Code] nvarchar(10) NULL
, [Ship Country] nvarchar(15) NULL
, [Ship Via] int NULL
, [Order Date] datetime NULL
, [Required Date] datetime NULL
, [Shipped Date] datetime NULL
, [Freight] money NULL
);' s from dual
     union all select regexp_replace (s,'(\[\w+)\s','\1_') from t
                where regexp_count   (s,'(\[\w+)\s') > 0
) select max(s) from t;
23 янв 13, 15:45    [13816216]     Ответить | Цитировать Сообщить модератору
 Re: Регулярные выражения. Заменить пробелы между словами в квадратных скобках  [new]
hexcept
Member

Откуда:
Сообщений: 237
тупо
with t as (select 'CREATE TABLE [Orders] (
[Order ID] int NOT NULL
, [Customer ID bla bla bla] nvarchar(5) NOT NULL
, [Employee ID] int NULL
, [Ship Name] nvarchar(40) NULL
, [Ship Address] nvarchar(60) NULL
, [Ship City] nvarchar(15) NULL
, [Ship Region] nvarchar(15) NULL
, [Ship Postal Code] nvarchar(10) NULL
, [Ship Country] nvarchar(15) NULL
, [Ship Via] int NULL
, [Order Date] date NULL
, [Required Date] datetime NULL
, [Shipped Date] datetime NULL
, [Freight] money NULL
);' s from dual
)
select
 replace(replace(
  regexp_replace(s,'(\w) +(\w)','\1_\2'),
  '_NOT',' NOT'),'_NULL',' NULL')
from t;
23 янв 13, 16:31    [13816712]     Ответить | Цитировать Сообщить модератору
 Re: Регулярные выражения. Заменить пробелы между словами в квадратных скобках  [new]
Dr_Murdock
Member

Откуда:
Сообщений: 5
Благодарен всем за помощь и отклик! Мой косяк - забыл указать версию.
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

orawish, Благодарю за наводку, очень долго ломал голову как сделать нечто подобное, но так и не дошел...

hexcept, самый главный минус этого метода - заменятся все пробелы текста.
Будет очень много ошибок или огромное множество replace, но что и на что replace`ить не известно.

Постараюсь переделать в соответствующее 10g решение и потом выложу. Может кому-нибудь пригодиться.
23 янв 13, 17:11    [13816994]     Ответить | Цитировать Сообщить модератору
 Re: Регулярные выражения. Заменить пробелы между словами в квадратных скобках  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Dr_Murdock
..
Постараюсь переделать в соответствующее 10g решение и потом выложу. Может кому-нибудь пригодиться.

вместо рекурсивного факторинга стройте обычное дерево
23 янв 13, 18:33    [13817493]     Ответить | Цитировать Сообщить модератору
 Re: Регулярные выражения. Заменить пробелы между словами в квадратных скобках  [new]
zhal
Member

Откуда: Киев-Харьков
Сообщений: 647
Изврат для 10-ки без REGEXP
WITH s AS (
SELECT 'CREATE TABLE [Orders] (
[Order ID] int NOT NULL
, [Customer ID] nvarchar(5) NOT NULL
, [Employee ID] int NULL
, [Ship Name] nvarchar(40) NULL
, [Ship Address] nvarchar(60) NULL
, [Ship City] nvarchar(15) NULL
, [Ship Region] nvarchar(15) NULL
, [Ship Postal Code] nvarchar(10) NULL
, [Ship Country] nvarchar(15) NULL
, [Ship Via] int NULL
, [Order Date] datetime NULL
, [Required Date] datetime NULL
, [Shipped Date] datetime NULL
, [Freight] money NULL
);' str FROM dual)
SELECT MAX(replace(SYS_CONNECT_BY_PATH(REPLACE(to_replace, from_str, REPLACE(from_str,' ','_')),'%'),'%')) KEEP (DENSE_RANK LAST ORDER BY lvl) new_str
  FROM (select s.str, LEVEL lvl, LEVEL-1 prev_lvl
              ,SUBSTR(s.str
                     ,decode(LEVEL,1,1,INSTR(s.str,'[',1,LEVEL))
                     ,decode(INSTR(s.str,'[',1,LEVEL+1),0,LENGTH(s.str)+1,INSTR(s.str,'[',1,LEVEL+1))-decode(LEVEL,1,1,INSTR(s.str,'[',1,LEVEL))
                     ) to_replace
              ,SUBSTR(s.str, INSTR(s.str,'[',1,LEVEL), INSTR(s.str,']',1,LEVEL)-INSTR(s.str,'[',1,LEVEL)+1) from_str
          FROM s
        CONNECT BY LEVEL<LENGTH(s.str)-LENGTH(REPLACE(s.str,'['))+1
       )
 CONNECT BY prev_lvl = PRIOR lvl
 START WITH lvl=1
23 янв 13, 19:22    [13817686]     Ответить | Цитировать Сообщить модератору
 Re: Регулярные выражения. Заменить пробелы между словами в квадратных скобках  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
with t as (
select 'bla bla bla [fff ddddd ggg xx] lala [yy zz xx]' s 
from dual
) select replace( regexp_replace( replace(s,' ','_'),'(\[.+?\]|_)','\1 '),'_ ',' ')
   from t;

(навскидку, не проверял) с 10.2 совместимо
23 янв 13, 19:59    [13817867]     Ответить | Цитировать Сообщить модератору
 Re: Регулярные выражения. Заменить пробелы между словами в квадратных скобках  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
чуть точнее
with t as (
select 'CREATE TABLE [Orders] (
[Order ID] int NOT NULL
, [Customer ID] nvarchar(5) NOT NULL
, [Employee ID] int NULL
, [Ship Name] nvarchar(40) NULL
, [Ship Address] nvarchar(60) NULL
, [Ship City] nvarchar(15) NULL
, [Ship Region] nvarchar(15) NULL
, [Ship Postal Code] nvarchar(10) NULL
, [Ship Country] nvarchar(15) NULL
, [Ship Via] int NULL
, [Order Date] datetime NULL
, [Required Date] datetime NULL
, [Shipped Date] datetime NULL
, [Freight] money NULL
);' s 
from dual
) select replace( replace(
           regexp_replace( s ,'(((^|\]).*?(\[|$))|\s)','\1'||chr(1),1,0,'n')
         ,' '||chr(1) ,'_') ,chr(1)) as res
    from t
/
23 янв 13, 20:54    [13818160]     Ответить | Цитировать Сообщить модератору
 Re: Регулярные выражения. Заменить пробелы между словами в квадратных скобках  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54398
Для целей ТС хватило бы и UDF, имхо
23 янв 13, 21:42    [13818243]     Ответить | Цитировать Сообщить модератору
 Re: Регулярные выражения. Заменить пробелы между словами в квадратных скобках  [new]
Dr_Murdock
Member

Откуда:
Сообщений: 5
Всем огромное спасибо за ответы и советы! Попытался разобраться CONNECT BY, но что то, как то мутно, ничего не понял.
Особая благодарность orawish, последний пример отработал идеально.
Всем +100 к карме)
24 янв 13, 10:48    [13819969]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить