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

Откуда:
Сообщений: 247
Привет, прокомментируйте пожалуйста след. SQL и результат:
SELECT 
  REGEXP_REPLACE('OLI-', '[^A-Z\-]{1}', '_') repl,
  REGEXP_REPLACE('OLI-', '[^A-Z\-\_]{1}', '_') repl2
FROM
  DUAL
WHERE
  REGEXP_LIKE('OLI-', '\-', 'c') 

------------------

oracle
REPL REPL2
---- ------
OLI- OLI_
1 row selected.


Хотелось бы в repl2 получить тоже 'OLI_'...



oracle
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE 11.2.0.4.0 Production
TNS for 64-bit Windows: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production
1 фев 16, 13:01    [18755817]     Ответить | Цитировать Сообщить модератору
 Re: REGEXP_REPLACE: не трогать минус  [new]
синтаксис не читал,но обсуждаю
Guest
зеленый админ,

что, по-твоему, означет обратный слеш в квадратных скобках регэкспа и модификатор {1}?
1 фев 16, 13:09    [18755890]     Ответить | Цитировать Сообщить модератору
 Re: REGEXP_REPLACE: не трогать минус  [new]
зеленый админ
Member

Откуда:
Сообщений: 247
1) Backslash - escape символ. В частности, чтобы минус не трактовало как часть range
2) {1} - в точности один символ. Мне нужно поменять все неправилные символы, оставляя количество на выходе неизменным.

Другую трактовку после твоего поста не нашел...
1 фев 16, 13:18    [18755950]     Ответить | Цитировать Сообщить модератору
 Re: REGEXP_REPLACE: не трогать минус  [new]
Elic
Member

Откуда:
Сообщений: 29988
зеленый админ
1) Backslash - escape символ. В частности, чтобы минус не трактовало как часть range
Не надо выдумывать, надо читать доку.
1 фев 16, 13:32    [18756087]     Ответить | Цитировать Сообщить модератору
 Re: REGEXP_REPLACE: не трогать минус  [new]
зеленый админ
Member

Откуда:
Сообщений: 247
Elic,

В любом случае этого не достаточно

SELECT
  REGEXP_REPLACE(UPPER('A%-%9'), '[^A-Z0-9-_./ ]', '_') repl2
FROM
  DUAL
WHERE
  REGEXP_LIKE('OLI-', '\-', 'c') 


Actual result :
oracle

REPL2
-----
A___9
1 row selected.


Expected result: 'A_-_9'

П.С. Посмотрел уже на lookahead, но они в реплейсах бессмысленны...
1 фев 16, 13:49    [18756253]     Ответить | Цитировать Сообщить модератору
 Re: REGEXP_REPLACE: не трогать минус  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
зеленый админ,

select REGEXP_REPLACE('OLI-asd_asd', '[^[:upper:]-_]', '+') from dual

OLI-+++_+++
1 фев 16, 13:50    [18756259]     Ответить | Цитировать Сообщить модератору
 Re: REGEXP_REPLACE: не трогать минус  [new]
зеленый админ
Member

Откуда:
Сообщений: 247
зеленый админ,

Нашел! Многие движки (и оракл тоже) рекомендуют просто вставлять минус первым:
[^-_./ A-Z0-9]
1 фев 16, 13:51    [18756264]     Ответить | Цитировать Сообщить модератору
 Re: REGEXP_REPLACE: не трогать минус  [new]
зеленый админ
Member

Откуда:
Сообщений: 247
зеленый админ,

The hyphen can be included right after the opening bracket, or right before the closing bracket, or right after the negating caret. Both [-x] and [x-] match an x or a hyphen.

http://www.regular-expressions.info/charclass.html
1 фев 16, 13:54    [18756288]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить