[#] Регулярные выражения Oracle. Опасный диапазон
habrabot(difrex,1) — All
2015-10-26 11:30:04


![][1] Разработчик Oracle, часто использующий в коде [регулярные выражения][2], особенно на базах с православными настройками, рано или поздно может столкнуться с явлением, которое, кроме как мистикой, никак не назовешь. Длительные поиски причин возникновения проблемы могут привести к потере веса, аппетита и спровоцировать различного рода психосоматические расстройства — все это я сейчас и попробую предотвратить. А поможет мне в этом функция regexp\_replace. Она может иметь до 6 аргументов: **REGEXP\_REPLACE** (

1. исходная\_строка,
2. шаблон,
3. заменяющая\_строка,
4. позиция начала поиска совпадения с шаблоном (по умолчанию 1),
5. номер вхождения шаблона в исходную строку (по умолчанию 0 – все вхождения),
6. модификатор (пока что темная лошадка)

) Возвращает измененную исходную\_строку, в которой все вхождения шаблона заменены значением, переданным в параметре заменяющая\_строка. Зачастую пользуются короткой версией функции, где заданы 3 первых аргумента, что бывает достаточно для решения многих задач. Я тоже так сделаю. Допустим, нам нужно в строке 'MASK: lower case' замаскировать все строчные символы звездочками. Для задания диапазона строчных символов должен подойти шаблон '[a-z]'. Проверяем

select regexp_replace('MASK: lower case', '[a-z]', '*') as result from dual


Ожидание

+------------------+
| RESULT |
+------------------+
| MASK: ***** **** |
+------------------+


Реальность

+------------------+
| RESULT |
+------------------+
| *A**: ***** **** |
+------------------+


Если на вашей базе это явление не воспроизвелось, значит вам пока повезло. Но чаще начинаются копания в кодировках, конвертации строк из одного набора символов в другой и со временем наступает примерно такое состояние [Читать дальше →][3]

[1]: https://habrastorage.org/files/01b/768/4f4/01b7684f4e9848379102b3c798272fea.jpg
[2]: http://docs.oracle.com/database/121/ADFNS/adfns_regexp.htm#ADFNS9999
[3]: http://habrahabr.ru/post/269387/#habracut