Oracle
 sql >> база данни >  >> RDS >> Oracle

REGEXP_REPLACE() Функция в Oracle

В Oracle, REGEXP_REPLACE() функцията заменя появата на подниз в низ, който съответства на дадения модел на регулярен израз.

Той разширява функционалността на REPLACE() функция, като ни позволява да използваме модели на регулярни изрази.

Синтаксис

Синтаксисът е така:

REGEXP_REPLACE ( source_char, pattern
                 [, replace_string
                    [, position
                       [, occurrence
                          [, match_param ]
                       ]
                    ]
                 ]
               )

Къде:

  • source_char е символен израз, който служи като стойност за търсене.
  • pattern е регулярният израз.
  • replace_string е заместващият низ.
  • position е положително цяло число, което указва къде да започне търсенето. По подразбиране е 1 , което означава, започнете търсенето от първия знак.
  • occurrence е неотрицателно цяло число, което указва кое събитие да се замени. По подразбиране е 0 , което означава заместване на всички събития.
  • match_param ви позволява да промените поведението на съвпадение по подразбиране на функцията. Например, той ви позволява да зададете чувствителност към малки и големи букви, как се обработват множество редове и интервали и т.н. Този аргумент работи по същия начин, както когато се използва с REGEXP_COUNT() функция. Вижте документацията на Oracle за повече информация.

Пример

Ето един основен пример за използване на REGEXP_REPLACE() в Oracle:

SELECT 
    REGEXP_REPLACE('Cats and dogs', 'd.g', 'bird')
FROM DUAL;

Резултат:

Cats and birds

В този случай има съвпадение и поднизът се заменя със заместващия низ.

Регулярните изрази могат да бъдат много мощни и този пример използва много прост пример. За да използвате REGEXP_REPLACE() ефективно, ще трябва да знаете правилния модел, който да използвате за желания резултат.

Няма съвпадение

Ето пример, където няма съвпадение:

SELECT REGEXP_REPLACE('Cats and dogs', 't.g', 'bird');

Резултат:

+------------------------------------------------+
| REGEXP_REPLACE('Cats and dogs', 't.g', 'bird') |
+------------------------------------------------+
| Cats and dogs                                  |
+------------------------------------------------+

Няма съвпадение, така че оригиналният низ се връща непроменен.

Множество съвпадения

Ето пример с множество съвпадения:

SELECT 
    REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird')
FROM DUAL;

Резултат:

My bird likes other birds

Можете обаче да посочите кое събитие да замените, ако е необходимо:

SELECT 
REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird', 1, 2)
FROM DUAL;

Резултат:

My dog likes other birds

Имайте предвид, че добавих два аргумента тук – 1 и 2 . 1 определя местонахождението в низа, за да започне търсенето (в този случай на първия знак). 2 е това, което определя кое събитие да се замени. В този случай второто появяване се заменя.

Ето какво се случва, ако започна търсенето след първото срещане:

SELECT 
REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird', 7, 2)
FROM DUAL;

Резултат:

My dog likes other dogs

В този случай низът не се актуализира, защото има само още едно събитие след началната позиция.

Ако променя последния аргумент на 1 , след което се актуализира, както е посочено (тъй като това е първото появяване след посочената начална позиция):

SELECT 
REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird', 7, 1)
FROM DUAL;

Резултат:

My dog likes other birds

И в случай, че се чудите, 0 посочва всички събития:

SELECT REGEXP_REPLACE(
    'My dog likes big dogs and small dogs', 
    'd.g', 
    'bird', 1, 0
    )
FROM DUAL;

Резултат:

My bird likes big birds and small birds

Но все пак уважава всяка посочена начална позиция:

SELECT REGEXP_REPLACE(
    'My dog likes big dogs and small dogs', 
    'd.g', 
    'bird', 7, 0
    )
FROM DUAL;

Резултат:

My dog likes big birds and small birds

Чувствителност на регистрите

REGEXP_REPLACE() функцията следва правилата за определяне и извеждане на съпоставяне на Oracle, които дефинират съпоставянето, което да се използва при съпоставяне на низа с шаблона.

Въпреки това, можете изрично да посочите чувствителност към малки и малки букви с незадължителния шести аргумент. Когато направите това, той отменя всяка чувствителност към малки и големи букви или чувствителност към акцента на определеното съпоставяне.

Можете да посочите i за съвпадение без значение на главни и c за съвпадение, чувствително към главни букви.

Ето един пример:

SELECT 
    REGEXP_REPLACE('My Cats', 'c.t', 'dog', 1, 0) AS "Default",
    REGEXP_REPLACE('My Cats', 'c.t', 'dog', 1, 0, 'i') AS "Case Insensitive",
    REGEXP_REPLACE('My Cats', 'c.t', 'dog', 1, 0, 'c') AS "Case Sensitive"
FROM DUAL;

Резултат:

   Default    Case Insensitive    Case Sensitive 
__________ ___________________ _________________ 
My Cats    My dogs             My Cats         

От тези резултати изглежда, че съпоставянето ми по подразбиране е чувствително към малки и големи букви. Другите два низа бяха принудени към съвпадение, независимо от главни и малки букви, съответно.

Нулеви аргументи

Предаването на null води до null за повечето аргументи, с изключение на втория и шестия аргумент:

SET NULL 'null';
SELECT 
    REGEXP_REPLACE(null, 'c.t', 'dog', 1, 0, 'i') AS "1",
    REGEXP_REPLACE('Cat', null, 'dog', 1, 0, 'i') AS "2",
    REGEXP_REPLACE('Cat', 'c.t', null, 1, 0, 'i') AS "3",
    REGEXP_REPLACE('Cat', 'c.t', 'dog', null, 0, 'i') AS "4",
    REGEXP_REPLACE('Cat', 'c.t', 'dog', 1, null, 'i') AS "5",
    REGEXP_REPLACE('Cat', 'c.t', 'dog', 1, 0, null) AS "6"
FROM DUAL;

Резултат:

      1      2       3       4       5      6 
_______ ______ _______ _______ _______ ______ 
null    Cat    null    null    null    Cat   

По подразбиране SQLcl и SQL*Plus връщат празно пространство всеки път, когато null възниква в резултат на SQL SELECT изявление.

Можете обаче да използвате SET NULL за да посочите различен низ, който да бъде върнат. Тук посочих, че низът null трябва да бъдат върнати.

Грешен брой аргументи

Предаването на никакви аргументи на функцията или твърде малко води до грешка:

SELECT REGEXP_REPLACE()
FROM DUAL;

Резултат:

Error starting at line : 1 in command -
SELECT REGEXP_REPLACE()
FROM DUAL
Error at Command Line : 1 Column : 8
Error report -
SQL Error: ORA-00938: not enough arguments for function
00938. 00000 -  "not enough arguments for function"
*Cause:    
*Action:

Същото е и с предаването на твърде много аргументи:

SELECT REGEXP_REPLACE('Cat', 'c.t', 'dog', 1, 0, 'i', 'oops')
FROM DUAL;

Резултат:

Error starting at line : 1 in command -
SELECT REGEXP_REPLACE('Cat', 'c.t', 'dog', 1, 0, 'i', 'oops')
FROM DUAL
Error at Command Line : 1 Column : 8
Error report -
SQL Error: ORA-00939: too many arguments for function
00939. 00000 -  "too many arguments for function"
*Cause:    
*Action:

Повече информация

REGEXP_REPLACE() функцията (както и другата реализация на регулярни изрази на Oracle) съответства на стандарта за регулярни изрази на интерфейса на IEEE Portable Operating System Interface (POSIX) и на Указанията за регулярни изрази на Unicode на Unicode Consortium.

Вижте документацията на Oracle за повече информация и примери за REGEXP_REPLACE() функция.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle DBA ментор

  2. При отваряне на връзка с оракул, обектът за връзка е нулев

  3. ORA-01017 Съвети за разрешаване на грешки на Oracle

  4. Как да получите броя на елементите в JSON масив, съхранен като CLOB с Oracle 12c?

  5. Свързване на Oracle към SQL Server през защитена връзка